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

Ответ

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

Пример на PHP:

class ParentClass {
    public static function test() {
        // static ссылается на класс, который вызвал test()
        static::missingMethod(); // Ищет missingMethod в вызывающем классе
    }
}

class ChildClass extends ParentClass {}

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

Практический совет: Перед вызовом через static:: стоит проверять существование метода:

if (method_exists(static::class, 'methodName')) {
    static::methodName();
}

Ответ 18+ 🔞

А, ну это же классика, ёпта! Смотри, тут ситуация как с дверью в тёмной комнате: ты уверен, что там ручка есть, хватаешься, а там хуй с горы — пустота. Вот и PHP так же.

Когда ты пишешь static::отсутствующийМетод(), интерпретатор, такой довольный, начинает искать этот метод, используя свою хитрожопую систему под названием «позднее статическое связывание». Он не полезет сразу в родительский класс, где ты это написал. Нет! Он начнёт копать с того класса, который реально вызвал твой код, и полезет вверх по его родословной. И если на всём этом пути метода нет — всё, приехали. Будет тебе не ошибка, а полноценный фатальный пиздец, который скрипт нахуй завершит.

Вот смотри на примере, тут всё понятно становится:

class ParentClass {
    public static function test() {
        // А static тут — это как указатель: "Ищи в том, кто меня позвал!"
        static::missingMethod(); // И начинает рыскать по вызывающему классу
    }
}

class ChildClass extends ParentClass {}

// Пытаемся запустить
ChildClass::test();
// И тут же получаем в лицо: Fatal error: Uncaught Error: Call to undefined method ChildClass::missingMethod()

Видишь? Ребёнок (ChildClass) позвал метод test от родителя. Внутри test стоит static::. И PHP, такой: «Ага, значит надо искать missingMethod в классе ChildClass!». Ищет. Не находит. И бабахает ошибку. Родитель-то тут вообще ни при чём, его даже не спросили. Волнение, блядь, на нуле, а терпения у интерпретатора — ноль ебать.

Так что же делать, чтобы не охуеть от таких сюрпризов?

Да просто не быть распиздяем! Прежде чем хвататься за статический вызов, проверь, а есть ли там вообще эта ручка. Как нормальный человек перед прыжком в бассейн пальцем воду пробует.

// Вот так — умно и безопасно.
if (method_exists(static::class, 'methodName')) {
    static::methodName();
} else {
    // Ну или сделай что-то адекватное, а не роняй всё к хуям собачьим.
    throw new Exception('Э, сабака сука, метода-то нет!');
}

Вот и весь секрет. Не надейся на авось, а то будет тебе хиросима, а не работающий код. Э, бошка, думай!