Назад к вопросам
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:: Класс, который был вызван
Поведение при наследовании Не учитывает переопределение в дочерних классах Учитывает переопределение в дочерних классах