Сегодня принятый ответ является устаревшим.
Переименование классов - это плохая практика: вы должны помнить, что и где переименовывать каждый раз при обновлении до более новой версии. Иногда (например, используя Reflection или сложную структуру зависимости) это невозможно без радикального рефакторинга. И это accidental complexity, которого вы хотите избежать. Вот почему в PHP были введены пространства имен. Java, C++ или C# не используют __construct
, они используют именованный конструктор, и с ними нет проблем.
В РНР 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
следует использовать.
Разъяснение о плохой практике, упомянутой выше (для Dennis)
Где-то в вашем коде вы можете использовать ReflectionClass::getName(); когда вы переименовываете класс, вам нужно запомнить, где вы использовали Reflection, и проверить, остается ли результат getName()
в вашем приложении. Чем больше вам нужно помнить что-то конкретное, тем более вероятно что-то забыто, что приводит к ошибкам в приложении.
Родители не могут контролировать все классы в мире, которые зависят от них. Если включено allow_url_include, некоторые другие веб-сайты могут использовать класс с вашего сервера, что может привести к сбою при переименовании какого-либо класса. Это еще хуже в компилируемых языках, упомянутых выше: библиотека может быть скопирована и добавлена в другой код.
Там нет причин, почему переименовать класс:
- если конфликты имен класса, использование пространств имен
- если сдвиги класса ответственности, получить какой-то другой класс вместо
В PHP классах в пространстве имен метод с тем же именем следует избегать: интуитивно он должен создать объект, созданный классом; если он делает что-то еще, зачем давать ему одно и то же имя? Это должен быть конструктор и ничего больше. Основная проблема заключается в том, что поведение такого метода зависит от использования пространства имен.
Нет проблем с конструкторами __construct в PHP. Но не самая умная идея изменить именованные конструкторы.
Стиль конструктора PHP 4.x будет устаревшим в PHP 7.0 и удален в следующем главном выпуске. http://php.net/manual/de/migration70.deprecated.php#migration70.deprecated.php4-constructors – SimonSimCity 2015-10-21 08:42:37