PHP. Позднее статическое связывание
21.03.2019
Теги: PHP • Web-разработка • Класс
Позднее статическое связывание дает возможность унаследованным методам класса иметь доступ к статическим методам, свойствам и константам класса потомка, а не только родительского класса. Рассмотрим пример:
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
значение будет определено в момент запуска (в тот момент, когда машинный код будет выполнятся в движке).
Еще один пример — доступ к статическому методу класса потомка:
<?php 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
<?php 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. Отправка почты по событию
Поиск: PHP • Web-разработка • Класс • static • self