belarusweb.net
© Петр Романовский Минск, 2016-2017.



belarusweb.net

Основы создания сайтов...
PHP+MySQL >>>
                          Учебник Задачник Справочник

6.5. Определение области видимости свойств и методов

Как было сказано выше, область видимости свойств и методов определяется во время объявления при помощи ключевых слов public (общедоступный), protected (защищенный) или private (закрытый). Доступ к свойствам и методам класса, объявленным как public, разрешен отовсюду, protected разрешает доступ из родительских классов и классов-потомков, а модификатор private ограничивает область видимости пределами самого класса. Использование свойств с различным уровнем доступа показано в примере 6.9.

<?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{
	protected $protected_var='p_var ';	//Переопределяем свойство, область видимости
													//при этом можно было изменить на public
	function all_func(){						//Переопределяем метод 
      echo $this->protected_var.'<br>';//Это свойство доступно, т.к. оно protected и  
													//запрашивается изнутри класса-потомка
		echo $this->private_var.'<br>';	//Ошибка, свойство доступно только изнутри 
													//класса parent_class, где было объявлено
	}
}

$obj=new parent_class();  			//Создаем экземпляр родительского класса 
$obj_2=new descendant_class();   //Создаем экземпляр класса-потомка

$obj->all_func();			  //Сработает без ошибок 
//$obj_2->all_func();	  //Выдаст ошибку, т.к. свойство $this->private_var
								  //неопределено в классе-потомке и доступно только изнутри 
								  //класса parent_class, где оно было объявлено

//echo $obj->private_var;	 //Выдаст ошибку, т.к. свойство вне класса недоступно
//echo $obj->protected_var; //Выдаст ошибку, т.к. свойство вне классов недоступно 
//echo $obj_2->private_var; //Выдаст ошибку, т.к. свойство неопределено в descendant_class
?>

Пример 6.9. Определение области видимости свойств классов

Следует помнить, что при переопределении свойств, объявленных как protected или private, область видимости свойств может быть расширена, но не уменьшена. Поэтому разрешается изменять область видимости свойства с private на protected или public, а также protected на public. Но область видимости свойств, объявленных как public, уже изменить нельзя.

В отличие от свойств, при объявлении области видимости методов ключевое слово public разрешается не указывать, т.к. в случае отсутствия такового интерпретатор по умолчанию будет рассматривать их как public. Все остальное справедливо и для методов (см. пример 6.10).

<?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(){				//Переопределяем метод 
      $this->protected_func(); 	//Этот метод доступен, т.к. он protected и  
											//запрашивается изнутри класса-потомка
		$this->private_func();		//Ошибка, метод доступен только изнутри 
											//класса parent_class, где он был объявлен
	}
}
$obj=new parent_class();  			//Создаем экземпляр родительского класса 
$obj_2=new descendant_class();   //Создаем экземпляр класса-потомка

$obj->all_func();			  //Сработает без ошибок 
//$obj_2->all_func();	  //Выдаст ошибку, т.к. метод $this->private_func() 
								  //неопределен в классе-потомке и доступен только  
								  //изнутри класса parent_class, где он был объявлен

//$obj->protected_func(); //Выдаст ошибку, т.к. метод вне классов недоступен
//$obj->private_func();   //Выдаст ошибку, т.к. метод вне класса недоступен 
?>

Пример 6.10. Определение области видимости методов классов

Контрольные вопросы и задания

  1. Как определяется область видимости свойства, метода?

Словарь новых английских слов

one-off [wʌnˈɒf] – одноразовый.
partial [ˈpɑːʃ(ə)l] – частичный.
class [klɑːs] – класс.
new [njuː] – новый.
empty [ˈempti] – пустой.
constant [ˈkɒnst(ə)nt] – константа.
person [ˈpəːs(ə)n] – личность, персона.
object [ˈɒbdʒɪkt] – объект.
method [ˈmɛθəd] – метод.
property [ˈprɒpəti] – свойство.
public [ˈpʌblɪk] – открытый, общественный.
protected [prəˈtektɪd] – защищенный.
private [ˈprʌɪvət] – закрытый, частный.
this [ðɪs] – это, этот.
static [ˈstatɪk] – статичный, неподвижный.
extend [ɪkˈstɛnd] – расширять.
self [self] – собственный.
parent [ˈpɛːr(ə)nt] – родитель, предок.
exit [ˈeksɪt] – выход, выйти.
nest [nest] – вставлять один предмет в другой.
final [ˈfʌɪn(ə)l] – заключительный, окончательный.
construct [kənˈstrʌkt] – создавать, конструировать.
destruct [dɪˈstrʌkt] – разрушать, уничтожать.
descendant [dɪˈsɛnd(ə)nt] – потомок.
abstract [ˈæbstrækt] – абстрактный, отвлеченный.
interface [ˈɪntəfeɪs] – интерфейс, область контакта.
implement [ˈɪmplɪment] – осуществлять, реализовывать.
trait [treɪt] – особенность, черта.
use [ˈjuːs] – употреблять, использовать.
instead [ɪnˈstɛd] – вместо, взамен.
as [æz] – как.
anonymous [əˈnɒnɪməs] – безымянный, анонимный.
clone [kləʊn] – клон, двойник.
set [set] – устанавливать.
unset [ʌnˈsɛt] – удалять.
get [ɡet] – получать.
call [kɔːl] – вызывать, звать.

Комментарии (0)
Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!    
     
belarusweb.net © Петр Романовский, Минск, 2016-2017.
Связаться с автором
Наверх