Позднее статическое связывание

PHP реализует функцию, называемую позднее статическое связывание, которая может быть использована для того, чтобы получить ссылку на вызываемый класс в контексте статического наследования. ( www.php.net)

    Позднее статическое связывание

    Позднее статическое связывание может быть использовано чтобы получить ссылку на вызываемый класс в контексте статического наследования
    Перенаправленный вызов - это вызов, который начинается с self::, parent::, static::, или, если двигаться вверх по иерархии классов, forward_static_call()
    Функция get_called_class() может быть использована для получения строки с именем вызванного класса, а static:: представляет её область действия
    Если говорить более точно, позднее статическое связывание сохраняет имя класса указанного в последнем "неперенаправленном вызове"
    Также эта особенность была названа "статическое связывание" потому, что она может быть использована (но не обязательно) в статических методах
    Статические ссылки на текущий класс, такие как self:: или __CLASS__, вычисляются используя класс, к которому эта функция принадлежит, как и в том месте, где она была определена:

    class A { public static function who() { echo __CLASS__ . "<br>"; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__ . "<br>"; } } $class1 = new A; $class2 = new B; A::who(); #A B::who(); #B A::test(); #A B::test(); #A

    Позднее статическое связывание пытается устранить это ограничение, предоставляя ключевое слово, которое ссылается на класс, вызванный непосредственно в ходе выполнения. Попросту говоря, ключевое слово, которое позволит вам ссылаться на B из test() в предыдущем примере. Было решено не вводить новое ключевое слово, а использовать static, которое уже зарезервировано

    class A { public static function who() { echo __CLASS__ . "<br>"; } public static function test() { static::who(); // Здесь действует позднее статическое связывание } } class B extends A { public static function who() { echo __CLASS__ . "<br>"; } } $class1 = new A; $class2 = new B; A::who(); #A B::who(); #B A::test(); #A B::test(); #B

    В нестатическом контексте вызванным классом будет тот, к которому относится экземпляр объекта. Поскольку $this-> будет пытаться вызывать закрытые методы из той же области действия, использование static:: может дать разные результаты. Другое отличие в том, что static:: может ссылаться только на статические поля класса

    #3 Использование static:: в нестатическом контексте class A { public function who() { echo __CLASS__ . "<br>"; } public function test() { $this->who(); static::who(); } } class B extends A { public function who() { echo __CLASS__ . "<br>"; } } $class1 = new A; $class2 = new B; var_dump($class1); echo "<br>"; var_dump($class2); echo "<br>"; $class1->who(); #A $class2->who(); #B $class1->test(); #AA $class2->test(); #BB
    Источники
    Последнее изменение: 20.11.2024 04:47


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ