Сегодня принятый ответ устарел.
Переименование классов — плохая практика: вы должны помнить, что и где переименовывать каждый раз, когда обновляетесь до более новой версии. Иногда (например, при использовании 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, некоторые другие веб-сайты могут использовать class с вашего сервера, что может привести к сбою, если вы переименуете какой-либо class. В упомянутых выше компилируемых языках дело обстоит еще хуже: библиотеку можно скопировать и встроить в другой код.
Нет причин переименовывать класс:
- если имя класса конфликтует, используйте пространства имен
- если ответственность за класс смещается, вместо этого создайте другой класс
В классах PHP в пространстве имен в любом случае следует избегать метода с тем же именем: интуитивно он должен создавать объект, созданный классом; если он делает что-то другое, зачем давать ему такое же имя? Это должен быть конструктор и ничего больше. Основная проблема заключается в том, что поведение такого метода зависит от использования пространства имен.
В PHP нет проблем с конструкторами __construct. Но менять именованные конструкторы было не самой разумной идеей.
person
Jan Turoň
schedule
16.06.2013