Назад к вопросам
Middle
153
questionbank

Что такое self и static в PHP и как они используются?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Self ссылается на текущий класс, в котором определен код. Static ссылается на класс, который был фактически вызван во время выполнения.

<?php

class MyClass {
    public static function myStaticMethod() {
        // Здесь self:: ссылается на MyClass
        echo self::class . "::myStaticMethod() called\n";
    }

    public static function delegatedStaticMethod() {
        // Здесь static:: ссылается на MyClass или на дочерний класс, который вызвал метод
        echo static::class . "::delegatedStaticMethod() called\n";
        self::myStaticMethod(); // Вызывает метод из MyClass
    }
}

class MyChildClass extends MyClass {
    public static function anotherStaticMethod() {
        // Здесь static:: ссылается на MyChildClass
        echo static::class . "::anotherStaticMethod() called\n";
        self::myStaticMethod(); // Все еще вызывает метод из MyClass
    }
}

MyClass::myStaticMethod(); // MyClass::myStaticMethod() called
MyClass::delegatedStaticMethod(); // MyClass::delegatedStaticMethod() called, MyClass::myStaticMethod() called
MyChildClass::delegatedStaticMethod(); // MyChildClass::delegatedStaticMethod() called, MyClass::myStaticMethod() called
MyChildClass::anotherStaticMethod(); // MyChildClass::anotherStaticMethod() called, MyClass::myStaticMethod() called

?>
Ключевое слово Привязка Используется для
self Название текущего класса (привязка на этапе компиляции) Доступ к статическим свойствам, константам и методам текущего класса.
static Название класса, вызвавшего метод (позднее статическое связывание) Доступ к статическим свойствам, константам и методам в контексте вызвавшего класса (может быть дочерним).

Основное отличие заключается в позднем статическом связывании (static), которое позволяет наследованию переопределять статическое поведение, тогда как self всегда ссылается на класс, где код был определен.