Что такое ключевое слово self в PHP?

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

Ответ

Ключевое слово self в PHP используется внутри класса для ссылки на этот же класс. Оно применяется для доступа к статическим свойствам и методам, а также для указания типа возвращаемого значения.

Основные случаи использования:

  1. Доступ к статическим членам класса:

    class Logger {
        private static array $logs = [];
    
        public static function addLog(string $message): void {
            self::$logs[] = $message; // self ссылается на класс Logger
        }
    }
  2. Указание типа возвращаемого значения (возврат экземпляра текущего класса):

    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:

  • Для реализации шаблона «Фабричный метод», где каждый наследник должен создавать свой собственный экземпляр.
  • В абстрактных классах или трейтах, где логика должна работать с классом-потомком.