Разница self vs static
class Base {
public static function create(): static {
return new static(); // класс, на котором вызвали
}
public static function name(): string {
return static::class; // Late Static Binding
}
}
class Child extends Base {}
Child::create(); // возвращает Child, не Base
Child::name(); // "Child", не "Base"
Где используется
- Fluent interfaces и Builder-паттерны, возвращающие
static
- ActiveRecord-стиль:
User::find(1) возвращает User, а не базовый класс
- Статические фабричные методы в иерархиях