Что будет при вызове отсутствующего метода в потомке с помощью self::?

«Что будет при вызове отсутствующего метода в потомке с помощью self::?» — вопрос из категории ООП, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При вызове self::отсутствующийМетод() в классе-потомке произойдет фатальная ошибка (Fatal Error). Это происходит потому, что self всегда ссылается на класс, в котором это ключевое слово написано, а не на класс, который его вызывает во время выполнения (потомок).

Пример на PHP:

class ParentClass {
    public static function foo() {
        echo "Parent foon";
    }
}

class ChildClass extends ParentClass {
    public static function bar() {
        // self ссылается на ChildClass, даже если метод вызван из него
        self::missingMethod(); // Фатальная ошибка
    }
}

ChildClass::bar();
// Вывод: Fatal error: Uncaught Error: Call to undefined method ChildClass::missingMethod()

Решение: Для вызова методов с учетом иерархии наследования во время выполнения используйте позднее статическое связывание с static::.