2013-09-29 6 views
1

Я столкнулся с этим очень странным поведением. Следующий кодПочему этот метод называется без запроса?

class TestClass { 
    function testClass() { 
     echo "Don't show me!"; 
    } 
} 

$testing = new TestClass; 

выполняет свой метод testClass без его называют! Однако testClass не будет работать, если переименовано во что-нибудь еще, как testClass1. Есть ли скрытая «магия PHP» за этим поведением?

EDIT. В конце я вижу, что этот вопрос тривиально для ниндзя, выросших с помощью PHP. Как недавний новичок в PHP, я научился использовать __construct в качестве конструктора. С этим «реликвийным поведением» осторожно удалены из современных уроков. Я так рад, что люди поняли, как это ужасно, меняя имя класса и забывая изменить конструктор - какой кошмар!

+5

Метод с именем имени как класса, который он отличается от, будет считаться конструктором класса. –

+0

Этот метод 'testClass()' называется тем же самым, что и сам класс. Он будет работать подобно методу '__construct()'. Обычно лучше использовать '__construct()', хотя это более понятно для чтения. – Daniel

+1

Если вы не хотите, чтобы он был вызван, добавьте еще один метод и назовите его __construct, тогда класс будет использовать __construct как конструктор класса вместо метода с тем же именем, что и класс. – Ultimater

ответ

6

Пред-PHP5, метод __construct не использовался как конструктор класса. Вместо этого использовался метод с тем же именем, что и класс.

От documentation:

Для обратной совместимости, если PHP-не может найти __construct() функции для данного класса, а класс не может наследоваться от родительского класса, он будет искать для Старонового функцию конструктора стиля, по имени класса. Фактически это означает, что единственным случаем, который имел бы проблемы с совместимостью, является то, что у класса был метод с именем __construct(), который использовался для различной семантики.

Создание (пустой) конструктор (метод с именем __construct) остановит сообщение от того вторит при инициализации класса (необходимо только для < PHP 5.3.3 *):

class TestClass { 
    function __construct() { 

    } 
    function testClass() { 
     echo "Don't show me!"; 
    } 
} 

* As of PHP 5.3.3 , методы с тем же именем, что и последний элемент имени класса с именами, больше не будут рассматриваться как конструктор. Это изменение не влияет на классы, не содержащие имен.

1

В старых версиях PHP метод конструктора с таким же именем, что и имя класса, считался конструктором.

Смежные вопросы