Что такое поздние статические привязки в PHP?
источник
Что такое поздние статические привязки в PHP?
Вам обязательно нужно прочитать Поздние статические привязки в руководстве по PHP. Тем не менее, я постараюсь дать вам краткое резюме.
По сути, это сводится к тому, что self
ключевое слово не следует тем же правилам наследования. self
всегда разрешается в классе, в котором он используется. Это означает, что если вы создадите метод в родительском классе и вызовете его из дочернего класса, self
он не будет ссылаться на дочерний класс, как вы могли бы ожидать.
Позднее статическое связывание вводит новое использование static
ключевого слова, которое устраняет этот конкретный недостаток. Когда вы используете static
, он представляет класс, где вы впервые используете его, т.е. он «привязывается» к классу времени выполнения.
Это две основные концепции, стоящие за этим. Путь self
, parent
и static
работать , когда static
в игре может быть тонкими, так что вместо того , чтобы пойти , чтобы более подробно, я настоятельно рекомендую вам изучить руководство примеров страниц. Как только вы поймете основы каждого ключевого слова, примеры станут необходимыми, чтобы увидеть, какие результаты вы собираетесь получить.
self
ключевое слово не соответствует правилам наследования.self
всегда разрешает класс, в котором оно используется». - Это не означает, что вы не можете вызывать статический метод родителя через дочерний объектself
, как с нестатическими методами. Возможно, вы имеете в виду правильные вещи, но вы должны перефразировать это. Все это действительно имеет значение, только если у детей есть члены с одинаковыми именами, так как вы можете решить, на кого ссылаться, используяstatic::
вместо этого.Из PHP: Поздние статические привязки - Руководство :
Давайте посмотрим на пример:
источник
Там не очень очевидное поведение:
Следующий код производит 'alphabeta'.
Однако, если мы удалим объявление функции classname из бета-класса, в результате мы получим «alphaalpha».
источник
Я цитирую из книги: «PHP Master написать передовой код».
Не стесняйтесь взглянуть и на официальную документацию php: http://php.net/manual/en/language.oop5.late-static-bindings.php
Самый простой способ объяснить позднюю статическую привязку - это простой пример. Взгляните на два определения классов ниже и читайте дальше.
Мы видим Родительский класс (Автомобиль) и Детский класс (Автомобиль). Родительский класс имеет 2 открытых метода:
invokeDriveByStatic
invokeStopBySelf
Родительский класс также имеет 2 приватных метода:
drive
stop
Дочерний класс переопределяет 2 метода:
drive
stop
Теперь давайте вызовем публичные методы:
invokeDriveByStatic
invokeStopBySelf
Спросите себя: какой класс вызывает
invokeDriveByStatic
/invokeStopBySelf
? Родительский или Детский класс?Посмотрите ниже:
static
Ключевое слово используется в шаблоне проектирования Singleton. Смотрите ссылку: https://refactoring.guru/design-patterns/singleton/php/exampleисточник
Самый простой пример, чтобы показать разницу.
Обратите внимание, self :: $ c
Позднее статическое связывание, обратите внимание на статическое :: $ c
источник
Например:
источник
Глядя на это с "почему я бы использовал это?" в перспективе это в основном способ изменить контекст, из которого интерпретируется / запускается статический метод.
С
self
контекстом является тот, где вы определили метод первоначально. Сstatic
того, с кого ты звонишь.источник
Также смотрите, обновляете ли вы статические переменные в дочерних классах. Я нашел этот (несколько) неожиданный результат, когда дочерний B обновляет дочерний C:
Вы можете исправить это, объявив одну и ту же переменную в каждом дочернем классе, например:
источник