Что такое позднее статическое связывание (Late Static Binding) в PHP?

«Что такое позднее статическое связывание (Late Static Binding) в PHP?» — вопрос из категории PHP Core, который задают на 31% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевое отличие:

  • self:: — ссылается на класс, в котором конструкция была определена.
  • static:: — ссылается на класс, из которого она была вызвана (позднее связывание).

Пример:

class ParentClass {
    public static function getClass() {
        return __CLASS__;
    }

    public static function test() {
        echo 'self::: ' . self::getClass() . "n"; // Всегда ParentClass
        echo 'static:: ' . static::getClass() . "n"; // Зависит от вызывающего класса
    }
}

class ChildClass extends ParentClass {
    public static function getClass() {
        return __CLASS__;
    }
}

ParentClass::test();
// Вывод:
// self:: ParentClass
// static:: ParentClass

ChildClass::test();
// Вывод:
// self:: ParentClass (потому что self определен в ParentClass)
// static:: ChildClass (позднее связывание!)

Практическое применение: LSB критически важен для реализации таких шаблонов, как Singleton, Active Record или Factory Method в иерархиях наследования, где фабричный метод родительского класса должен создавать экземпляры дочернего класса.