#7.12 php Наследование и защищённые методы
Primary tabs
Как было показано выше, публичные (public) свойства и методы доступны для вызова извне объекта, а приватные - нет. Но если свойство или метод объявлены как защищенные (protected), доступ к ним разрешен не только изнутри класса, где они описаны, но также изнутри всех классов, порожденных на основе данного. Например, если метод set_name
класса Animal
будет объявлен как protecdet, непосредственный его вызов снаружи класса будет невозможен и приведет к возникновению ошибки, что и продемонстрировано ниже (используется также класс Lion
, описанный в предыдущем разделе).
class Animal { protected $name; protected function set_name($text) { $this->name = $text; } ... } ... echo "Создание нового льва...<BR>"; $lion = new Lion; $lion->set_name("Бонифаций");
Выполнение данного фрагмента кода приведет к ошибке:
Fatal error: Uncaught Error: Call to protected method Animal::set_name() from global scope in /var/www/mysite/index.php:39 Stack trace: #0 {main} thrown in /var/www/mysite/index.php on line 39
С другой стороны, защищенный метод set_name
доступен не только внутри базового класса Animal
, но и внутри порожденного класса Lion
, поэтому его можно использовать, например, в конструкторе класса Lion
для инициализации имени животного, что показано в примере 1.
Пример 1. Использование защищенных методов
<HTML> <HEAD> <TITLE>Защищенные методы</TITLE> </HEAD> <BODY> <CENTER> <H1> Защищенные методы </H1> <?php class Animal { protected $name; protected function set_name($text) { $this->name = $text; } public function get_name() { return $this->name; } } class Lion extends Animal { public function roar() { echo $this->name, " рычит! <BR>"; } public function __construct($text) { $this->set_name($text); } } echo "Создание нового льва...<BR>"; $lion = new Lion("Бонифаций"); echo $lion->roar(); ?> </CENTER> </BODY> </HTML>
Выполнение данного примера показано на рисунке 1.
- Log in to post comments
- 531 reads