Guest User

Untitled

a guest
Nov 16th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.46 KB | None | 0 0
  1. <?php
  2.  
  3. class Cabinet {
  4.     private $password; // приватное свойство, доступ - в пределах класса, не наследуется
  5.     protected $login; // защищенное свойство, доступ - в пределах класса и наследников
  6.    
  7.     // публичный метод, возможно вызывать в коде в контексте объекта;
  8.     // конструктор иногда делают private - тогда объект доступен через статичное свойство,
  9.     // которое его способно вызвать, и вызывает. Пример - паттерн Singleton
  10.     public function __construct ($login, $password)
  11.         {
  12.         $this->password = $password;
  13.         $this->login = $login;
  14.         }
  15.     // этот метод невозможно перегрузить,
  16.     // для проверки раскомментировать соотвествующий метод в наследующем классе
  17.     final function __get($property)
  18.         {
  19.         $method = "get{$property}";
  20.         if (method_exists($this, $method))
  21.             {
  22.             return $this->$method();
  23.             }
  24.             echo $method;
  25.         }
  26.     // этот метод невозможно перегрузить,
  27.     // для проверки раскомментировать соотвествующий метод в наследующем классе
  28.     final function getPassword()
  29.         {
  30.         return('Restricted access');
  31.         }
  32. }
  33.  
  34. // класс, в которым попробуем получить различными способами доступ к паролю
  35. class HackedCabinet extends Cabinet
  36.     {
  37.     /**
  38.      * Доступ к логину есть! (а для пароля - нет!)
  39.      */
  40.     public function getLogin()
  41.         {
  42.         return $this->login;
  43.         }
  44.     /**
  45.     * Пробуем перезаписать геттер - не получится!
  46.     */
  47.    
  48.     /** TODO: раскомментировать для проверки
  49.     function __get($property) // Fatal error: Cannot override final method Cabinet::__get() in Z:\home\ppdb.lan\www\test.php on line 42
  50.         {
  51.         $method = "get{$property}";
  52.         if (method_exists($this, $method))
  53.             {
  54.             return $this->$method();
  55.             }
  56.         }
  57.     */
  58.    
  59.     /**
  60.      * Пробуем перезаписать функцию получения - не получится, доступ по-прежнему будет через родительский класс
  61.     */
  62.    
  63.     /** TODO: раскомментировать для проверки
  64.     function getPassword() // Fatal error: Cannot override final method Cabinet::getPassword() in Z:\home\ppdb.lan\www\test.php on line 41
  65.         {
  66.         return $this->password;
  67.         }
  68.     */
  69.    
  70.     /**
  71.      * Пробуем напрямую обратиться - не получится, вызовется getPassword()
  72.     */
  73.     function hackPassword()
  74.         {
  75.         return $this->password;
  76.         }
  77.     }
  78.  
  79. $hacked_cabinet = new HackedCabinet('hacker', 'qwerty');
  80.  
  81.  
  82. echo $hacked_cabinet->password; // Restricted access
  83. echo '<br />';
  84. echo $hacked_cabinet->getPassword(); // Restricted access
  85. echo '<br />';
  86. echo $hacked_cabinet->hackPassword(); // Restricted access
  87. echo '<br />';
  88. echo $hacked_cabinet->login; // hacker
  89. echo '<br />';
  90. print_r($hacked_cabinet); // HackedCabinet Object ( [password:private] => qwerty [login:protected] => hacker )
  91. echo '<br />';
  92. die(var_dump($hacked_cabinet)); // object(HackedCabinet)#1 (2) { ["password:private"]=> string(6) "qwerty" ["login:protected"]=> string(6) "hacker" }
  93. ?>
Add Comment
Please, Sign In to add comment