Области видимости свойств и методов в PHP
http://belarusweb.net
Основы создания сайтов

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

Как было сказано выше, область видимости свойств и методов определяется во время объявления при помощи ключевых слов 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. Определение области видимости методов классов