PHP. Позднее статическое связывание
Позднее статическое связывание дает возможность унаследованным методам класса иметь доступ к статическим методам, свойствам и константам класса потомка, а не только родительского класса. Рассмотрим пример:
class Abc const NAME = 'ABC'; public function getName() return self::NAME; > > class Xyz extends Abc const NAME = 'XYZ'; > $abc = new Abc(); $xyz = new Xyz(); echo $abc->getName(), "\n"; echo $xyz->getName(), "\n";
Этот код выдаст такой результат:
ABC ABC
Класс Xyz унаследовал метод getName() , но при этом self все еще указывает на класс, в котором оно используется. И рассмотрим новый пример:
class Abc const NAME = 'ABC'; public function getName() return static::NAME; > > class Xyz extends Abc const NAME = 'XYZ'; > $abc = new Abc(); $xyz = new Xyz(); echo $abc->getName(), "\n"; echo $xyz->getName(), "\n";
Этот код выдаст такой результат:
ABC XYZ
Ключевое слово static указывает, что необходимо использовать константу унаследованного класса, вместо константы, которая была определена в классе, где объявлен метод getName() .
Основное отличие между этими двумя способами доступа (и причина, почему связывание назвали поздним), в том, что PHP определят значение для self::NAME во время «компиляции» (когда символы PHP преобразуются в машинный код, который будет обрабатываться движком), а для static::NAME значение будет определено в момент запуска (в тот момент, когда машинный код будет выполнятся в движке).
Еще один пример — доступ к статическому методу класса потомка:
class Abc public function __construct() self::who(); > public static function who() echo __CLASS__, "\n"; > > class Xyz extends Abc public static function who() echo __CLASS__, "\n"; > > $abc = new Abc(); $xyz = new Xyz();
Abc Abc
class Abc public function __construct() static::who(); > public static function who() echo __CLASS__, "\n"; > > class Xyz extends Abc public static function who() echo __CLASS__, "\n"; > > $abc = new Abc(); $xyz = new Xyz();
Abc Xyz
- Блог на Laravel 7, часть 1. Создание таблиц БД, наполнение тестовыми данными
- Магазин на Laravel 7, часть 25. Поиск по каталогу товаров, деплой проекта на хостинг TimeWeb
- Laravel. Наблюдатели за событиями Eloquent
- Laravel. События, слушатели и подписчики
- Laravel. Работа с БД. Часть вторая — конструктор запроса
- Laravel. Работа с БД. Часть первая — сырой запрос
- Laravel. Отправка почты по событию
Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Категории блога
Облако тегов
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (122)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (169)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (69)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (28)
- Ключ (28)
- Команда (87)
- Компонент (60)
- Конфигурация (64)
- Корзина (32)
- ЛокальнаяСеть (32)
- Модуль (34)
- Навигация (31)
- Настройка (141)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (101)
- Сервер (75)
- Событие (27)
- Теория (106)
- Установка (66)
- Файл (51)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
PHP → Late Static Binding простыми словами
Раннее связывание означает, что объект и вызов функции связываются между собой на этапе компиляции. Это означает, что вся необходимая информация для того, чтобы определить, какая именно функция будет вызвана, известна на этапе компиляции программы.
Позднее связывание означает, что объект связывается с вызовом функции только во время исполнения программы, а не раньше.
Пример Late Dynamic Binding
class Shape < public function draw() < echo 'Draw some shape..'; >> class Square extends Shape < public function draw() < echo 'Draw square..'; >> class Circle extends Shape < public function draw()< echo 'Draw circle..'; >> function drawShape(Shape $shape) < $shape->draw(); > drawShape(new Circle()); // echo 'Draw cirlce..'
Транслятор каждый раз при проходе через этот участок будет проверять что это за объект $shape , и выбирать реализацию метода draw() из соответствующего класса.
Такая динамическая проверка типа называется поздним динамическим связыванием:
Поздним, потому что мы связываем объект и реализацию уже после компиляции.
Динамическим, потому что мы делаем это при каждом прохождении через этот участок.
Пример Late Static Binding
Позднее статическое связывание позволяет нам получить ссылку на вызываемый класс в контексте статического наследования.
«Позднее связывание» в названии отражает тот факт, что обращения через static:: не будут вычисляться по отношению к классу, в котором вызываемый метод определен, а будут вычисляться в ходе исполнения.
«Статическое» отражает, что связывание может быть использовано (но не обязательно) в статических методах.
class ParentClass < public static function who() < echo __CLASS__; >public static function useSelf() < self::who(); >public static function useStatic() < // применение Late Static Bidning static::who(); >> class ChildClass extends ParentClass < public static function who() < echo __CLASS__; >> ChildClass::useSelf(); // ParentClass // but ChildClass::useStatic(); // ChildClass
Простыми словами позднее статическое связывание это «об» ключевом слова static , которое ссылается на класс, вызванный непосредственно в ходе выполнения.
Позднее статическое связывание в PHP
Позднее статическое связывание является очень важной концепцией в PHP. В этом уроке мы узнаем, что такое позднее статическое связывание и как использовать эту концепцию.
В PHP позднее статическое связывание используется для ссылки на вызываемый класс в контексте статического наследования.
Прежде чем углубиться в концепцию позднего статического связывания, давайте разберемся в разнице между self и static в PHP.
Разница между self и static в PHP
Когда мы используем ключевое слово self в классе, оно всегда будет относиться к тому классу, в котором оно упоминается, а не к классу, который его наследует. Давайте разберемся с этой концепцией на примере:
public static function getClassName() < return __class__; >> echo A::printClass(); // A is printed
Результат выполнения вышеупомянутого сценария — вывод «А». Это то, что мы ожидали. Давайте перейдем к другому примеру.
public static function getClassName() < return __class__; >> class B extends A < public static function getClassName() < return __class__; >> echo B::printClass(); // Still it prints A
И снова результатом выполнения этого сценария является вывод «А». Метод printClass определен внутри класса A. Класс B расширяет класс A. Когда мы вызываем метод printClass , область действия этого метода все еще находится внутри класса A.
ПРИМЕЧАНИЕ: ключевое слово self в PHP относится к классу, в котором оно находится, и не обязательно к классу, его расширяющему.
Позднее статическое связывание в PHP
Чтобы решить эту проблему, на помощь приходит концепция позднего статического связывания. Давайте использовать ключевое слово static вместо self .
public static function getClassName() < return __class__; >> class B extends A < public static function getClassName() < return __class__; >> echo B::printClass(); // Prints B echo A::printClass(); // Prints A
Когда мы используем ключевое слово static , мы ссылаемся на класс, который вызывается во время выполнения.
Само название «позднее статическое связывание» отражает в себе внутреннюю реализацию этой особенности. «Позднее связывание» отражает тот факт, что обращения через static:: не будут вычисляться по отношению к классу, в котором вызываемый метод определен, а будут вычисляться на основе информации в ходе исполнения. Также эта особенность была названа «статическое связывание» потому, что она может быть использована (но не обязательно) в статических методах.
Руководство php.net
Статья является свободным переводом материала сайта https://webrewrite.com/
© 2023 Scorpion’s Lair Sitemap
Что такое раннее и позднее статическое связывание?
указывает на текущий класс, поэтому в результате получаем значение ‘transport’, этот механизм еще называется «Ранним статическим связыванием».
class Transport < public static $model = 'transport'; public static function getModel() < return static::$model; >> class Car extends Transport < public static $model = 'car'; >echo Car::getModel(); // 'car'
Если слово «self» заменить на «static», то мы получим «позднее статическое связывание», т.е. связь будет установлена с тем классом, который вызывает данный код, в результате получим значение «car».