Встречается на 26% собеседований по PHP

Какая разница между self и this

В PHP self и $this — это два разных способа обращения к элементам класса: $this ссылается на текущий объект (экземпляр класса), а self — на сам класс в статическом контексте. $this используется для доступа к свойствам и методам конкретного объекта, в то время как self — для доступа к статическим свойствам, константам и статическим методам класса.

Как это работает

$this — это псевдопеременная, доступная внутри методов объекта. Она всегда указывает на текущий экземпляр класса, из которого был вызван метод. С её помощью можно обращаться к нестатическим свойствам и методам объекта, а также передавать объект как аргумент.

self — это ключевое слово, которое ссылается на класс, в котором оно используется. Оно работает в статическом контексте: внутри статических методов, при обращении к статическим свойствам и константам. self нельзя использовать для доступа к нестатическим членам класса, так как они принадлежат объекту, а не классу.

Примеры

Использование $this

php
class User {
    public $name;

    public function setName($name) {
        $this->name = $name; // обращение к свойству объекта
    }

    public function getName() {
        return $this->name; // обращение к методу объекта
    }
}

$user = new User();
$user->setName('Анна');
echo $user->getName(); // Анна

Использование self

php
class Config {
    public static $prefix = 'app_';

    public static function getPrefix() {
        return self::$prefix; // обращение к статическому свойству
    }
}

echo Config::getPrefix(); // app_

Подводные камни

  • self ссылается на класс, где оно написано, а не на класс в контексте наследования. Если в дочернем классе переопределить статическое свойство или метод, self в родительском классе всё равно будет указывать на родительский класс. Для позднего статического связывания используйте static.
  • $this нельзя использовать в статических методах, так как там нет объекта.
  • self можно использовать и в нестатических методах для доступа к статическим членам, но это не обязательно.

Когда использовать

  • $this — всегда, когда нужно работать с данными конкретного объекта: свойствами, методами, переданными в конструктор.
  • self — для доступа к статическим свойствам, константам и статическим методам внутри класса, особенно в статических методах.

Коротко

  • $this — ссылка на текущий объект, используется для нестатических членов.
  • self — ссылка на текущий класс, используется для статических членов.
  • self не поддерживает полиморфизм при наследовании, для этого есть static.
  • Выбор зависит от контекста: объектный или статический.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы