дружественные классы в 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]
Что делает пример?Получив стек вызовов, мы смотрим чем является последний вызывающий метод. Если это класс, которому мы хотим разрешить доступ — выполняем действие, а иначе - бросаем исключение (подробнее об исключениях в статье ренее)
Также рекомендую к прочтению: