Ответ
При вызове 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('Э, сабака сука, метода-то нет!');
}
Вот и весь секрет. Не надейся на авось, а то будет тебе хиросима, а не работающий код. Э, бошка, думай!