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

В чем разница между self и this?

2.0 Middle🔥 181 комментариев
#PHP Core#ООП

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

self vs this в PHP

self — указывает на текущий класс (static binding). this — указывает на текущий объект (динамический контекст).

Основная разница

class Animal {
    public static $name = 'Animal';
    public $instance_name = 'instance';
    
    public static function whoAmI() {
        echo self::$name;  // Всегда Animal
    }
    
    public function getInstance() {
        echo $this->instance_name;  // Может быть переопределено
    }
}

class Dog extends Animal {
    public static $name = 'Dog';
    public $instance_name = 'dog';
}

Dog::whoAmI();  // Выведет: Animal (self = текущий класс)
$dog = new Dog();
$dog->getInstance();  // Выведет: dog (this = объект)

self использует static binding

class Parent {
    public static function who() {
        echo self::class;  // Всегда Parent
    }
}

class Child extends Parent {}

Child::who();  // Выведет: Parent (не Child!)

static использует late static binding

class Parent {
    public static function who() {
        echo static::class;  // Вызванный класс
    }
}

class Child extends Parent {}

Child::who();  // Выведет: Child (правильно!)

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

Случайselfthisstatic
Статичные методы
Обращение к свойствам объекта?
Перегрузка в подклассах
Текущий класс (всегда)

Практические примеры

// Плохо: self не работает с наследованием
class BaseFactory {
    public static function create() {
        return new self();  // Всегда BaseFactory!
    }
}

class ChildFactory extends BaseFactory {}
$obj = ChildFactory::create();
var_dump($obj);  // BaseFactory, не ChildFactory!

// Хорошо: используй static
class BaseFactory {
    public static function create() {
        return new static();  // Правильный класс
    }
}

$obj = ChildFactory::create();
var_dump($obj);  // ChildFactory ✓

В методах объекта

class User {
    private $name;
    
    public function __construct($name) {
        $this->name = $name;  // this для свойств объекта
    }
    
    public function greet() {
        echo "Hello, " . $this->name;  // this
    }
    
    public static function getClassInfo() {
        echo self::class;  // self для класса
    }
}

Вывод

this — для работы с объектом и его свойствами. self — для обращения к классу (константы, статические методы). static — для late static binding (лучше для наследования).