Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Финализированные конструкторы под разными именами

Вчера вечером подумалось, что если в PHP сделать следующее, будет ошибка или нет:

class A {
    final public function a() {
        echo 1;
    }
}

class B extends A {
    public function b() {
        echo 2;
    }
}

$o = new B();

Интересно тут то, что не сразу видно в чём вообще загвоздка. Ну или я бы увидел не сразу, думаю, если бы сам этот пример не придумал. Кажется, все уже отвыкли в PHP от «старых» конструкторов, где конструктором считается метод, имя которого совпадает с именем класса (если нет метода «__construct»).

От осознания этого факта дополнительно отвлекают ничего незначащие имена классов и методов.

Проблема же в том, что в первом классе конструктор финализирован, его дальше переопределять нельзя. Но у второго класса имя конструктора другое. Вот и вопрос — что будет? От PHP можно чего угодно ожидать.

Тем не менее, тут язык выдаст логичную ошибку, которая, правда, способна вызвать лёгкое недоумение своей формулировкой:

Fatal error: Cannot override final A::a() with B::b() in test.php on line 12
3 комментария
Горбунов Олег 2013

К счастью, c PHP 5.3.3 старые конструкторы больше не работают.

SunChaser (sunchaser.info) 2013

Комментарий для Горбунов Олег:

работают и в 5.4 и в 5.5, в неймспейсах только не работают

Горбунов Олег 2013

Комментарий для sunchaser.info:

А точно, чуть ошибся.