дружественные классы в PHP

заметка, как продолжение статьи о методах доступа в PHP.

Как известно, в C++, кроме основных трех методов доступа к методам и свойствам классов, есть еще так называемые “дружественные классы” — классы, которым дозволено обращаться к любым методам и свойствам класса, указанного как друга. В PHP данной возможности к сожалению нет, а она так часто бывает необходимой… Зачем оно надо? Например, когда Вам надо создать экземпляр класса, реализующий возможность установки свойств через __set, но при этом Вы хотите свойства указывать более высокоуровневыми свойствами, нежели прямым воздействием на объект. Тогда можно было бы объявить метод __set protected и не заморачиваться, но что, если __set - унаследован от базового класса и объявлен как public? тогда поможет грязный хак :)
[php]

//переопределяем сеттер
public function __set($key, $val) {
$bt = debug_backtrace(); //получаем троссировку вызовов
if ($bt[1]['class'] == ‘OurFriendClass’) { //элемент с индексом 1 содержит информацию о предшественнике вызова текущей функции
$this->$key = $val;
} else {
throw new Exception(”Устанавливать значения можно только из \”дружественных\” классов.”);
}
}

[/php]

Что делает пример?Получив стек вызовов, мы смотрим чем является последний вызывающий метод. Если это класс, которому мы хотим разрешить доступ — выполняем действие, а иначе - бросаем исключение (подробнее об исключениях в статье ренее)

Tags: , , , , ,

Также рекомендую к прочтению:

Leave a Reply

Введите следующие символы: