В чем разница между self::, $this и static:: в PHP?

«В чем разница между self::, $this и static:: в PHP?» — вопрос из категории ООП, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Эти ключевые слова решают разные задачи при работе со свойствами и методами класса.

Ключевое слово Контекст Что ссылается
$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 {...}

Ключевые выводы:

  1. Используйте $this-> для работы с состоянием конкретного объекта.
  2. Используйте self::, когда вы уверены, что не хотите, чтобы метод/свойство переопределялись в дочерних классах (например, для финальных утилитных методов).
  3. Используйте static:: для реализации шаблона «Шаблонный метод», когда родительский класс определяет общий алгоритм, но часть шагов делегирует дочерним классам.