Перехват обращений к членам класса

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

1. Получение величины свойства объекта. Каждый раз, когда в программе производится попытка обратиться к некоторому несуществующему свойству на чтение, РНР пытается запустить метод __get() класса, передав ему в параметрах имя свойства. Если же свойство уже есть в объекте (например, объявлено в классе или же присвоено каким-либо другим образом), то никакого перехвата не происходит - РНР сразу же обращается к соответствующей переменной.

2. Установка нового значения для свойства. В случае если мы присваиваем некоторую величину несуществующему свойству класса. РНР пытается выполнить метод __set(). передав в параметрах имя свойства и его новое значение. Опять же, если свойство с указанным именем уже существует, вызова метода не происходит.

3. Запуск несуществующего метода класса. Если для некоторого объекта вызывается метод с незарегистрированным в классе именем, РНР запускает специальную функцию __call(), передавая ей два параметра: имя несуществующего метода и список аргументов, использованных при вызове. Метод __call() может отработать и вернуть некоторое значение, которое в итоге получит вызывающая программа.

Все три типа перехвата происходят для вызывающей программы совершенно "прозрачно": она может даже "не заметить", что произошел вызов служебного метода. Листинг 4 иллюстрирует сказанное на примере. В нем определяется класс Hooker, который перехватывает запросы ко всем несуществующим членам объекта (свойствам и методам). Во время присваивания значения свойству он дополнительно выполняет операцию trim() для значения. Таким образом, все величины, хранящиеся в данном классе, не будут содержать ведущих и концевых пробелов.

Листинг 4 Перехват обращений к членам класса. Файл overload.php

Обратите внимание на то, что обращения к "обычному" свойству $opened, а также к методу method() не было перехвачено.

ПРИМЕЧАНИЕ

Вы можете считать, что в любом классе всегда определены перехватчики _get(), _set() и _call(), однако по умолчанию они генерируют сообщение об ошибке: попытка обращения к несуществующему члену класса. Когда вы вводите свои перехватчики, то изменяете такое поведение.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: