← Назад к вопросам

Что такое self?

1.3 Junior🔥 241 комментариев
#PHP Core#ООП

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое self в PHP?

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

Основные особенности и использование self

1. Статическое связывание (early static binding)

self всегда ссылается на класс, в котором оно было написано, а не на класс, который может быть унаследован. Это называется ранним статическим связыванием.

class ParentClass {
    public static function getClass() {
        return self::class;
    }
}

class ChildClass extends ParentClass {}

echo ParentClass::getClass(); // Вывод: ParentClass
echo ChildClass::getClass();  // Вывод: ParentClass (а не ChildClass!)

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

Основное назначение self — обращение к статическим свойствам и методам внутри класса.

class Configuration {
    private static $settings = [];
    
    public static function set($key, $value) {
        self::$settings[$key] = $value;
    }
    
    public static function get($key) {
        return self::$settings[$key] ?? null;
    }
}

Configuration::set('debug', true);
echo Configuration::get('debug'); // true

3. Использование в константах класса

self часто используется для доступа к константам класса:

class Math {
    const PI = 3.14159;
    const E = 2.71828;
    
    public static function circleArea($radius) {
        return self::PI * $radius * $radius;
    }
}

echo Math::circleArea(5); // 78.53975

Сравнение self с $this и static

self vs $this:

  • $this — ссылается на текущий объект (экземпляр класса), используется только в нестатическом контексте
  • self — ссылается на текущий класс, используется только в статическом контексте
  • $this нельзя использовать в статических методах
class Example {
    private $instanceProperty = 'instance';
    private static $staticProperty = 'static';
    
    public function showInstance() {
        echo $this->instanceProperty; // Работает
        // echo self::$instanceProperty; // Ошибка!
    }
    
    public static function showStatic() {
        // echo $this->staticProperty; // Ошибка!
        echo self::$staticProperty; // Работает
    }
}

self vs static:

  • selfраннее связывание: ссылается на класс, где объявлен
  • staticпозднее статическое связывание: ссылается на класс, из которого вызван
class Animal {
    public static function who() {
        return 'Animal';
    }
    
    public static function testSelf() {
        return self::who();
    }
    
    public static function testStatic() {
        return static::who();
    }
}

class Dog extends Animal {
    public static function who() {
        return 'Dog';
    }
}

echo Dog::testSelf();   // Вывод: "Animal"
echo Dog::testStatic(); // Вывод: "Dog"

Практическое применение self

Паттерн Singleton

self часто используется в реализации паттерна Singleton:

class DatabaseConnection {
    private static $instance = null;
    
    private function __construct() {
        // Приватный конструктор
    }
    
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __clone() {}
    private function __wakeup() {}
}

$db1 = DatabaseConnection::getInstance();
$db2 = DatabaseConnection::getInstance();
var_dump($db1 === $db2); // true (это один и тот же объект)

Фабричные методы

class User {
    private $id;
    private $name;
    
    private function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
    }
    
    public static function create($name) {
        $id = uniqid();
        return new self($id, $name); // Создание нового экземпляра текущего класса
    }
}

$user = User::create('John Doe');

Важные нюансы

  1. Нельзя использовать self для доступа к нестатическим свойствам
  2. В трейтах self ссылается на класс, использующий трейт, а не на сам трейт
  3. В анонимных классах self ссылается на анонимный класс
trait Logger {
    public function log($message) {
        echo self::class . ': ' . $message; // Будет выводить имя класса, использующего трейт
    }
}

class Application {
    use Logger;
}

$app = new Application();
$app->log('test'); // Вывод: "Application: test"

Заключение

self — это основной инструмент для работы со статическими членами класса в PHP. Его правильное понимание и использование критически важно для:

  • Реализации паттернов проектирования (Singleton, Factory и др.)
  • Создания утилитарных классов с только статическими методами
  • Организации конфигураций и настроек приложения
  • Реализации позднего статического связывания (в комбинации с static)

Понимание различий между self, $this и static — один из ключевых признаков опытного PHP-разработчика, так как это напрямую влияет на архитектуру приложения и поведение кода при наследовании.