self — ссылается на класс, в котором метод определён (compile-time).
static — ссылается на класс, из которого метод вызван (runtime, late static binding).
class A {
public static function create(): static {
return new static(); // вернёт экземпляр B, если вызвано из B
}
}
class B extends A {}
B::create(); // → объект B, не A