LSB — механизм, который позволяет в статическом контексте ссылаться на реально вызванный класс, а не на тот, в котором написан метод.
Проблема: self:: всегда указывает на класс, где метод определён:
php
class Base {
public static function create() {
return new self(); // всегда вернёт Base!
}
}
class Child extends Base {}
Child::create(); // вернёт Base, а не Child
С static:: PHP смотрит на класс, через который был сделан вызов:
phpclass Base {
public static function create() {
return new static(); // вернёт тот класс, который вызвал
}
}
class Child extends Base {}
Child::create(); // вернёт Child ✅