Ответ
Эти ключевые слова решают разные задачи при работе со свойствами и методами класса.
| Ключевое слово | Контекст | Что ссылается |
|---|---|---|
$this |
Только внутри нестатического метода. | На текущий объект (экземпляр класса). Позволяет обращаться к нестатическим свойствам и методам. |
self:: |
Внутри класса (в статическом или нестатическом методе). | На класс, где оно написано (раннее связывание). Используется для статических свойств, методов и констант. |
static:: |
Внутри класса (в статическом или нестатическом методе). | На класс, который вызвал метод во время выполнения (позднее статическое связывание, LSB). |
Практический пример с наследованием:
class ParentClass {
protected static $value = 'Parent';
public static function getSelf() {
return self::$value; // Всегда ссылается на ParentClass
}
public static function getStatic() {
return static::$value; // Ссылается на класс, из которого вызван метод
}
public function showThis() {
return $this; // Возвращает текущий объект
}
}
class ChildClass extends ParentClass {
protected static $value = 'Child';
}
// Использование self:: vs static::
echo ParentClass::getSelf(); // 'Parent'
echo ParentClass::getStatic(); // 'Parent'
echo ChildClass::getSelf(); // 'Parent' (self:: берется из ParentClass)
echo ChildClass::getStatic(); // 'Child' (static:: определилось в runtime как ChildClass)
// Использование $this
$obj = new ChildClass();
var_dump($obj->showThis()); // object(ChildClass)#1 {...}
Ключевые выводы:
- Используйте
$this->для работы с состоянием конкретного объекта. - Используйте
self::, когда вы уверены, что не хотите, чтобы метод/свойство переопределялись в дочерних классах (например, для финальных утилитных методов). - Используйте
static::для реализации шаблона «Шаблонный метод», когда родительский класс определяет общий алгоритм, но часть шагов делегирует дочерним классам.