Что такое позднее связывание php

PHP → Late Static Binding простыми словами

Раннее связывание означает, что объект и вызов функции связываются между собой на этапе компиляции. Это означает, что вся необходимая информация для того, чтобы определить, какая именно функция будет вызвана, известна на этапе компиляции программы.

Позднее связывание означает, что объект связывается с вызовом функции только во время исполнения программы, а не раньше.

Пример Late Dynamic Binding

Транслятор каждый раз при проходе через этот участок будет проверять что это за объект $shape , и выбирать реализацию метода draw() из соответствующего класса.

Такая динамическая проверка типа называется поздним динамическим связыванием:

Поздним, потому что мы связываем объект и реализацию уже после компиляции.
Динамическим, потому что мы делаем это при каждом прохождении через этот участок.

Пример Late Static Binding

Позднее статическое связывание позволяет нам получить ссылку на вызываемый класс в контексте статического наследования.

«Позднее связывание» в названии отражает тот факт, что обращения через static:: не будут вычисляться по отношению к классу, в котором вызываемый метод определен, а будут вычисляться в ходе исполнения.

«Статическое» отражает, что связывание может быть использовано (но не обязательно) в статических методах.

Простыми словами позднее статическое связывание это «об» ключевом слова static , которое ссылается на класс, вызванный непосредственно в ходе выполнения.

Русские Блоги

Глядя на исходный код некоторого фреймворка или код определенного проекта, вы часто можете увидеть использование поздней статической привязки.
. Например, следующий абзац:

Здесь используется поздняя статическая привязка. Итак, что такое позднее статическое связывание?

«Позднее связывание» означает, что static :: больше не анализируется как класс, в котором определен текущий метод, а вычисляется во время фактического выполнения.

Здесь можно поговорить о двух концепциях: одна — это переадресация вызовов, а другая — непересылка вызовов.

Переадресация звонка
Так называемый «переадресационный вызов» относится к статическим вызовам, выполняемым следующими способами: self . parent . static :: и forward_static_Вызов(). То есть вызовы без имени класса при выполнении статических вызовов являются вызовами переадресации.

Как следует из названия, перед вызовом без пересылки стоит имя класса, поэтому вызываемая функция должна принадлежать «этому классу» и ее не нужно передавать другому классу. Вызов переадресации происходит из-за статической привязки на ранней стадии, которая может «пересылать другим классам», когда статический метод вызывается позже.

В официальной документации PHP говорится о позднем статическом связывании: Принцип работы позднего статического связывания заключается в том, чтобы сохранить имя класса в предыдущем «неперенаправленном вызове». Это означает, что когда мы вызываем перенаправленный статический вызов, фактически вызываемый класс является предыдущим неперенаправленным классом вызова.

Посмотрите на два примера:

Приведенный выше код выведет

Приведенный выше код выведет

Здесь в основном анализируется следующий пример 2.

1. C :: test (), это вызов без пересылки, потому что :: имеет имя класса C перед ним.

2. Введите метод test (), есть три статических вызова A :: foo (), parent :: foo (), self :: foo (), для этих трех статических вызовов их класс неперенаправленного вызова — C .

3. Теперь выполните A :: foo () — вызов без пересылки. Код в A :: foo () — static :: who (), который является переадресованным вызовом. Для этого переадресованного вызова его класс непересылаемого вызова больше не C, а A (потому что A: : foo ()). Итак, результат исполнения — A

4. Теперь выполните parent :: foo (). Это вызов переадресации. Куда его следует переадресовать? Это предыдущий класс вызовов без переадресации, который является классом C (упомянутым в шаге 2). Здесь необходимо отметить, что, хотя A :: foo () был выполнен до этого, предыдущий класс вызовов без пересылки parent :: foo () по-прежнему является классом C. Следовательно, результат выполнения — C.

5. Теперь выполните self :: foo (), это вызов переадресации, как parent :: foo (), поэтому C также выводится.

Преимущества использования позднего статического связывания

Поздняя статическая привязка в настоящее время используется при создании экземпляра объекта. При создании экземпляра объекта static будет определять созданный объект на основе класса, вызываемого во время выполнения, а self будет определять объект на основе местоположения объекта. Создайте экземпляр объекта. Когда мы хотим только создать экземпляр подкласса и не хотим, чтобы последующее использование подкласса влияло на подкласс из-за изменений в родительском классе, поздняя статическая привязка может сыграть свою роль.

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

Позднее статическое связывание является очень важной концепцией в PHP. В этом уроке мы узнаем, что такое позднее статическое связывание и как использовать эту концепцию.

В PHP позднее статическое связывание используется для ссылки на вызываемый класс в контексте статического наследования.

Прежде чем углубиться в концепцию позднего статического связывания, давайте разберемся в разнице между self и static в PHP.

Разница между self и static в PHP

Когда мы используем ключевое слово self в классе, оно всегда будет относиться к тому классу, в котором оно упоминается, а не к классу, который его наследует. Давайте разберемся с этой концепцией на примере:

Результат выполнения вышеупомянутого сценария — вывод "А". Это то, что мы ожидали. Давайте перейдем к другому примеру.

И снова результатом выполнения этого сценария является вывод "А". Метод printClass определен внутри класса A. Класс B расширяет класс A. Когда мы вызываем метод printClass , область действия этого метода все еще находится внутри класса A.

ПРИМЕЧАНИЕ: ключевое слово self в PHP относится к классу, в котором оно находится, и не обязательно к классу, его расширяющему.

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

Чтобы решить эту проблему, на помощь приходит концепция позднего статического связывания. Давайте использовать ключевое слово static вместо self .

Когда мы используем ключевое слово static , мы ссылаемся на класс, который вызывается во время выполнения.

Добавить комментарий

Ваш адрес email не будет опубликован.