@Vakhrushev

Изменение конструктора в legacy code. Как убрать имя конструктора как класс и не сломать старый код?

1. Код в ядре, ядро используется для большого числа проектов.
class Foo {
    public function Foo(){}
}

class Bar extends Foo {
    public function Bar() {
        parent::Foo();
    }
}


2. Проектный код который исползует ядро.
class Baz  extends Bar {
    public function __construct(){
        parent::Bar();
    }
}


вопрос. Можно ли както безопасно переписать ядро не трогая проектные файлы ?

Вот такой бубен работает, но это какойто костыль.
class Foo {
    private function construct() {}
    public function __construct(){
        $this->construct();
    }
    public function Foo(){
        $this->construct()
    }
}
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 1
@krypt3r
В целях обратной совместимости, если PHP 5 не может обнаружить объявленный метод __construct() и этот метод не наследуется от родительских классов, то вызов конструктора произойдет по устаревшей схеме, через обращение к методу, имя которого соответствует имени класса. Может возникнуть только одна проблема совместимости старого кода, если в нём присутствуют классы с методами __construct(), использующиеся для других целей.


Начиная с версии PHP 5.3.3, методы с именами, совпадающими с последним элементом имени класса, находящимся в пространстве имен, больше не будут считаться конструкторами. Это изменение не влияет на классы, не находящиеся в пространстве имен.

Другими словами, если у вас свежая версия PHP и используются пространства имен, ваш костыль нужен. В ином случае, лишние заморочки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы