PHP :: Области видимости свойств и методов
Как было сказано выше, область видимости свойств и методов определяется во время объявления при помощи ключевых слов public (общедоступный), protected (защищенный) или private (закрытый). Доступ к свойствам и методам класса, объявленным как public, разрешен отовсюду, protected разрешает доступ из родительских классов и классов-потомков, а модификатор private ограничивает область видимости пределами самого класса. Использование свойств с различным уровнем доступа показано в примере №1.
<?php class parent_class{ //Доступно изнутри самого класса и всех классов-потомков protected $protected_var='protected_var '; //Доступно только изнутри класса private $private_var='private_var '; function all_func(){ //Оба свойства доступны, т.к. запрашиваются //изнутри класса, где были определены echo $this->protected_var.'<br>'; echo $this->private_var.'<br>'; } } class descendant_class extends parent_class{ //Переопределяем свойство, область видимости //при этом можно было изменить на public protected $protected_var='p_var '; //Переопределяем метод function all_func(){ //Это свойство доступно, т.к. оно protected //и запрашивается изнутри класса-потомка echo $this->protected_var.'<br>'; //Ошибка, свойство доступно только изнутри //класса parent_class, где было объявлено //echo $this->private_var.'<br>'; } } //Создаем экземпляр родительского класса $obj=new parent_class(); //Создаем экземпляр класса-потомка $obj_2=new descendant_class(); //Сработает без ошибок $obj->all_func(); //Выдаст ошибку, свойство $this->private_var неопределено в классе-потомке //и доступно только изнутри класса parent_class, где оно было объявлено //$obj_2->all_func(); //Выдаст ошибку, т.к. свойство вне класса недоступно //echo $obj->private_var; //Выдаст ошибку, т.к. свойство вне классов недоступно //echo $obj->protected_var; //Выдаст ошибку, т.к. свойство неопределено в descendant_class //echo $obj_2->private_var; ?>
Пример №1. Определение области видимости свойств классов
Следует помнить, что при переопределении свойств, объявленных как protected или private, область видимости свойств может быть расширена, но не уменьшена. Поэтому разрешается изменять область видимости свойства с private на protected или public, а также protected на public. Но область видимости свойств, объявленных как public, уже изменить нельзя.
В отличие от свойств, при объявлении области видимости методов ключевое слово public разрешается не указывать, т.к. в случае отсутствия такового интерпретатор по умолчанию будет рассматривать их как public. Все остальное справедливо и для методов (см. пример №2).
<?php class parent_class{ //Доступен изнутри самого класса и всех классов-потомков protected function protected_func(){ echo 'Защищенный метод'.'<br>'; } //Доступен только изнутри класса private function private_func(){ echo 'Закрытый метод'.'<br>'; } //Объявляем общедоступный метод function all_func(){ //Оба метода доступны, т.к. запрашиваются //изнутри класса, где были определены $this->protected_func(); $this->private_func(); } } class descendant_class extends parent_class{ //Переопределяем метод function all_func(){ //Этот метод доступен, т.к. он protected и //запрашивается изнутри класса-потомка $this->protected_func(); //Ошибка, метод доступен только изнутри //класса parent_class, где он был объявлен //$this->private_func(); } } //Создаем экземпляр родительского класса $obj=new parent_class(); //Создаем экземпляр класса-потомка $obj_2=new descendant_class(); //Сработает без ошибок $obj->all_func(); //Выдаст ошибку, т.к. метод $this->private_func() //неопределен в классе-потомке и доступен только //изнутри класса parent_class, где он был объявлен //$obj_2->all_func(); //Выдаст ошибку, т.к. метод вне классов недоступен //$obj->protected_func(); //Выдаст ошибку, т.к. метод вне класса недоступен //$obj->private_func(); ?>
Пример №2. Определение области видимости методов классов
Быстрый переход к другим страницам
- Конструкторы и деструкторы в PHP
- Определение области видимости свойств и методов в PHP
- Специальные виды классов в PHP
- Вернуться к оглавлению учебника