#7.12 php Наследование и защищённые методы

Как было показано выше, публичные (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.



Рис. 1. Вызов защищенного метода