Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class Cabinet {
- private $password; // приватное свойство, доступ - в пределах класса, не наследуется
- protected $login; // защищенное свойство, доступ - в пределах класса и наследников
- // публичный метод, возможно вызывать в коде в контексте объекта;
- // конструктор иногда делают private - тогда объект доступен через статичное свойство,
- // которое его способно вызвать, и вызывает. Пример - паттерн Singleton
- public function __construct ($login, $password)
- {
- $this->password = $password;
- $this->login = $login;
- }
- // этот метод невозможно перегрузить,
- // для проверки раскомментировать соотвествующий метод в наследующем классе
- final function __get($property)
- {
- $method = "get{$property}";
- if (method_exists($this, $method))
- {
- return $this->$method();
- }
- echo $method;
- }
- // этот метод невозможно перегрузить,
- // для проверки раскомментировать соотвествующий метод в наследующем классе
- final function getPassword()
- {
- return('Restricted access');
- }
- }
- // класс, в которым попробуем получить различными способами доступ к паролю
- class HackedCabinet extends Cabinet
- {
- /**
- * Доступ к логину есть! (а для пароля - нет!)
- */
- public function getLogin()
- {
- return $this->login;
- }
- /**
- * Пробуем перезаписать геттер - не получится!
- */
- /** TODO: раскомментировать для проверки
- function __get($property) // Fatal error: Cannot override final method Cabinet::__get() in Z:\home\ppdb.lan\www\test.php on line 42
- {
- $method = "get{$property}";
- if (method_exists($this, $method))
- {
- return $this->$method();
- }
- }
- */
- /**
- * Пробуем перезаписать функцию получения - не получится, доступ по-прежнему будет через родительский класс
- */
- /** TODO: раскомментировать для проверки
- function getPassword() // Fatal error: Cannot override final method Cabinet::getPassword() in Z:\home\ppdb.lan\www\test.php on line 41
- {
- return $this->password;
- }
- */
- /**
- * Пробуем напрямую обратиться - не получится, вызовется getPassword()
- */
- function hackPassword()
- {
- return $this->password;
- }
- }
- $hacked_cabinet = new HackedCabinet('hacker', 'qwerty');
- echo $hacked_cabinet->password; // Restricted access
- echo '<br />';
- echo $hacked_cabinet->getPassword(); // Restricted access
- echo '<br />';
- echo $hacked_cabinet->hackPassword(); // Restricted access
- echo '<br />';
- echo $hacked_cabinet->login; // hacker
- echo '<br />';
- print_r($hacked_cabinet); // HackedCabinet Object ( [password:private] => qwerty [login:protected] => hacker )
- echo '<br />';
- die(var_dump($hacked_cabinet)); // object(HackedCabinet)#1 (2) { ["password:private"]=> string(6) "qwerty" ["login:protected"]=> string(6) "hacker" }
- ?>
Add Comment
Please, Sign In to add comment