Ответ
Позднее статическое связывание (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 в иерархиях наследования, где фабричный метод родительского класса должен создавать экземпляры дочернего класса.