Ответ
Ключевое слово self в PHP используется внутри класса для ссылки на этот же класс. Оно применяется для доступа к статическим свойствам и методам, а также для указания типа возвращаемого значения.
Основные случаи использования:
-
Доступ к статическим членам класса:
class Logger { private static array $logs = []; public static function addLog(string $message): void { self::$logs[] = $message; // self ссылается на класс Logger } } -
Указание типа возвращаемого значения (возврат экземпляра текущего класса):
class Config { public static function getInstance(): self { return new self(); // Создаёт экземпляр Config } }
Критически важное отличие self от static (позднее статическое связывание):
selfвсегда ссылается на класс, в котором оно написано.staticссылается на класс, из которого был вызван метод (позволяет переопределение в дочерних классах).
Наглядный пример различия:
class ParentClass {
public static function createWithSelf(): self {
return new self(); // Всегда вернёт объект ParentClass
}
public static function createWithStatic(): static {
return new static(); // Вернёт объект вызывающего класса
}
}
class ChildClass extends ParentClass {}
var_dump(ChildClass::createWithSelf()); // object(ParentClass)
var_dump(ChildClass::createWithStatic()); // object(ChildClass)
Когда использовать self:
- Когда вам гарантированно нужен экземпляр или статический член именно текущего класса, а не его наследника.
- Для фабричных методов, которые должны создавать объекты определённого, фиксированного класса.
Когда использовать static:
- Для реализации шаблона «Фабричный метод», где каждый наследник должен создавать свой собственный экземпляр.
- В абстрактных классах или трейтах, где логика должна работать с классом-потомком.