Blog. Just Blog

Изменение защищенных и приватных свойств класса

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Изменение защищенных и приватных свойств класса
Изменение защищенных и приватных свойств класса

Кто хоть раз пробовал ООП в PHP, знает, что при попытке записать что-то в защищенные или приватные свойства класса, интерпретатор выдаст ошибку. Это хорошо и правильно, приватные и защищенные свойства для того и сделаны именно такими. Но в PHP есть средства, с помощью которых можно обойти это правило и поменять эти свойства извне класса. Сначала позвольте дать вам три совета по использованию этих средств. Во-первых, никогда так не делайте. Во-вторых, никогда так не делайте. Ну и в-третьих, никогда так не делайте. Потому что на практике нет и быть не может ситуаций, когда это может действительно понадобиться, а огрести проблем - как нечего делать. Короче, я вас предупредил.

Для тестирования возьмем простейший класс с защищенным и приватным свойствами, а также с методами, позволяющими вывести на экран значения этих свойств:
  1. class MyClass {
  2.     private $pr_priv='private value';
  3.     protected $pr_prot='protected value';
  4.  
  5.     public function get_private() {
  6.         echo $this->pr_priv;
  7.     }
  8.  
  9.     public function get_protected() {
  10.         echo $this->pr_prot;
  11.     }
  12. }
Для доступа к свойствам и методам класса используется стандартный класс ReflectionProperty. С его помощью можно не только прочитать значения любых свойств класса, но также изменить их. Тут я приведу пример того, как это делается.
  1. // Создать экземпляр класса
  2. $my_class = new MyClass;
  3.  
  4. // Вывести значение приватного свойства
  5. $my_class->get_private();
  6. // -> "private value"
  7.  
  8. $reflection = new ReflectionProperty($my_class'pr_priv');
  9. // Открыть доступ к приватному свойству класса
  10. $reflection->setAccessible(true);
  11.  
  12. // Получить значение приватного свойства
  13. $value=$reflection->getValue($my_class);
  14. echo $value;
  15. // -> "private value"
  16.  
  17. // Изменить значение приватного свойства
  18. $value=$reflection->setValue($my_class'fucked!');
  19.  
  20. // Закрыть доступ
  21. $reflection->setAccessible(false);
  22.  
  23. // Вывести значение приватного свойства
  24. $my_class->get_private();
  25. // -> "fucked!"
Точно так же можно получить или поменять значение любого защищенного свойства класса. Как видите, PHP позволяет творить даже такую дичь в стиле "если нельзя, но очень хочется".

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 257 | Комментариев: 0

Метки: PHP

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.003 сек.) / Память: 5 Mb
Наверх