Что такое позднее статическое связывание в PHP?

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Разберём пример с использованием self:::

<?php
class A {
    public static function who() {
        echo __CLASS__; // Выведет A
    }
    public static function test() {
        self::who(); // Вызовет A::who()
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__; // Выведет B
    }
}

B::test(); // Выведет A

В этом случае self::who() внутри класса A всегда будет вызывать метод who из класса A, даже если вызов test() происходит из класса B.

Теперь рассмотрим пример с использованием static:::

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Вызовет who() из класса, который инициировал вызов test()
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test(); // Выведет B

Здесь static::who() внутри класса A при вызове из класса B будет ссылаться на класс B и вызовет метод who() из класса B.

Позднее статическое связывание позволяет динамически определять, какой класс использовать в контексте статического вызова в зависимости от того, какой класс фактически был вызван. Это становится особенно полезным при работе с иерархиями классов и статическими методами, которые должны вести себя полиморфно. Оно работает путем запоминания "вызванного не-перенаправленного класса" (конечного класса в цепочке наследования, с которого начался статический вызов) и использования его для разрешения ссылок static::.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее