Назад к вопросам
Middle
93
questionbank
В чем отличие между self и static в PHP?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
self ссылается на текущий класс на этапе компиляции (compile time), а static ссылается на класс, который был вызван в момент выполнения (runtime). Это особенно важно при работе с наследованием и поздним статическим связыванием.
Пример с self:
<?php
class ParentClass {
public static function who() {
echo __CLASS__; // Всегда ParentClass
}
public static function test() {
self::who(); // Всегда вызовет ParentClass::who()
}
}
class ChildClass extends ParentClass {
public static function who() {
echo __CLASS__; // ChildClass
}
}
ChildClass::test(); // Выведет "ParentClass"
Пример с static (позднее статическое связывание):
<?php
class ParentClassWithStatic {
public static function who() {
echo __CLASS__; // ParentClassWithStatic
}
public static function test() {
static::who(); // Вызовет who() в зависимости от класса, который вызвал test()
}
}
class ChildClassWithStatic extends ParentClassWithStatic {
public static function who() {
echo __CLASS__; // ChildClassWithStatic
}
}
ChildClassWithStatic::test(); // Выведет "ChildClassWithStatic"
Разница заключается в том, как определяется конечный класс, метод которого будет вызван. self "закрепляется" на этапе компиляции за классом, в котором он написан. static позволяет отложить определение до выполнения, используя класс, из которого был сделан вызов.
Таблица для сравнения:
| Особенность | self | static (Позднее статическое связывание) |
|---|---|---|
| Время связывания | Compile time (на этапе компиляции) | Runtime (на этапе выполнения) |
| Ссылка на класс | Класс, в котором написано self:: |
Класс, который был вызван |
| Поведение при наследовании | Не учитывает переопределение в дочерних классах | Учитывает переопределение в дочерних классах |