Комментарии (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 (правильно!)
Когда использовать
| Случай | self | this | static |
|---|---|---|---|
| Статичные методы | ✓ | ✗ | ✓ |
| Обращение к свойствам объекта | ✗ | ✓ | ? |
| Перегрузка в подклассах | ✗ | ✓ | ✓ |
| Текущий класс (всегда) | ✓ | ✗ | ✗ |
Практические примеры
// Плохо: 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 (лучше для наследования).