Сегодня принятый ответ устарел.
Переименование классов - это плохая практика: вы должны помнить, что и где переименовывать, каждый раз, когда вы обновляете до новой версии. Иногда (например, используя Reflection или сложную структуру зависимости) это может быть невозможно без радикального рефакторинга. И это случайная сложность , которую вы хотите избежать. Вот почему пространства имен были введены в PHP. Java, C ++ или C # не используют __construct
, они используют именованный конструктор, и с ними нет проблем.
Начиная с PHP 5.3.3, методы с тем же именем, что и последний элемент пространства имен , больше не будут рассматриваться как конструктор. Это изменение не влияет на классы без пространства имен .
Пример * ** тысяча двадцать-один * тысяча двадцать два
namespace Foo;
class Test {
var $a = 3;
function Test($a) {
$this->a = $a;
}
function getA() {
return $this->a;
}
}
$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function
Обратите внимание, что именованные конструкторы не рекомендуется (PHP 5.5 сегодня). Тем не менее, вы не можете предсказать, что ваш класс не будет использоваться в пространстве имен, поэтому __construct
должно быть предпочтительным.
Разъяснение о плохой практике, упомянутой выше (для Дениса)
Где-то в вашем коде вы можете использовать ReflectionClass :: getName () ; когда вы переименовываете класс, вы должны помнить, где вы использовали Reflection, и проверять, является ли результат getName()
все еще согласованным в вашем приложении. Чем больше вам нужно помнить что-то конкретное, тем больше вероятность того, что что-то забыто, что приводит к ошибкам в приложении.
Родители не могут контролировать все классы в мире, которые зависят от них. Если allow_url_include включен, некоторые другие веб-сайты могут использовать класс с вашего сервера, что может привести к сбою при переименовании какого-либо класса. Еще хуже в упомянутых выше скомпилированных языках: библиотеку можно копировать и связывать в другом коде.
Нет причины переименовывать класс:
- если имя класса конфликтует, используйте пространства имен
- если ответственность класса смещается, вместо этого выведите другой класс
В PHP-классах в пространстве имен следует избегать метода с тем же именем в любом случае: интуитивно он должен создавать объект, создавший класс; если он делает что-то еще, зачем давать ему то же имя? Это должен быть конструктор и ничего больше. Основная проблема заключается в том, что поведение такого метода зависит от использования пространства имен.
Нет проблем с конструкторами __construct в PHP. Но это была не самая умная идея изменить именованные конструкторы.