Оглавление

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

В предыдущем примере любой пользователь может напрямую изменить значение свойства myvar, присвоив ему значение следующим образом:
$obj->myvar = 20;
В  некоторых  случаях  требуется  контролировать  значение  свойств  класса,  а также запрещать использование методов, которые предназначены только для внутренней  реализации  класса.  Например,  если  в  свойстве  предполагается хранение определенных значений, то перед присвоением значения мы можем проверить соответствие значения некоторому условию. Если же любой пользователь будет иметь возможность ввести что угодно, минуя нашу проверку, то  ни  о  каком  контроле  не может  быть  и  речи. Такая  концепция  сокрытия данных называется инкапсуляцией.

 
В определении свойства и метода могут быть указаны следующие ключевые слова, определяющие область видимости идентификаторов:
□ public — открытый. Идентификатор доступен для внешнего использования. Если перед определением метода ключевое слово не указано, то метод по умолчанию  является открытым. Если ключевое слово не указано перед свойством, то интерпретатор выведет сообщение об ошибке. Вместо ключевого слова public можно указать ключевое слово var. Это слово следует применять только для совместимости с предыдущими версиями PHP;
□ private —  закрытый.  Идентификатор  доступен  только  внутри  данного класса;
□ protected —  защищенный.  Идентификатор  недоступен  для  внешнего использования,  но  доступен  для  данного  класса  и  для  потомков  этого класса.

 
Рассмотрим все на примере (листинг 71).

 
Листинг 71. Определение области видимости

<?php
class Class1 {
   var $var1 = 'var';
   public $var2 = 'public';
   private $var3 = 'private';
   protected $var4 = 'protected';
   public function f_get_var3() {
      return $this->var3; // Нормально
   }
   public function f_set_var3($s) {
      // Здесь проверяем на допустимость
      $this->var3 = $s;
   }
   public function f_get_var4() {
      return $this->var4; // Нормально
   }
}
class Class2 extends Class1 {
   public function f_var3() {
      return $this->var3; // Ошибка
   }
   public function f_var4() {
      return $this->var4; // Нормально
   }
}
$obj = new Class1();
echo $obj->var1, '<br>'; // 'var'
echo $obj->var2, '<br>'; // 'public'
echo $obj->var3, '<br>'; // Ошибка доступа
echo $obj->f_get_var3(), '<br>'; // 'private'
echo $obj->var4, '<br>'; // Ошибка доступа
echo $obj->f_get_var4(), '<br>'; // 'protected'
$obj = null;
$obj = new Class2();
echo $obj->f_var3(), '<br>'; // Ошибка доступа
echo $obj->f_var4(), '<br>'; // 'protected'
?>

 

Итак,  свойства $var1  и $var2,  описанные  как  открытые,  доступны  для  свободного изменения.
Получить доступ к закрытому свойству $var3 можно только через открытый метод f_get_var3(). Кроме того, внутри класса Class2 свойство $var3 также напрямую  недоступно.  Для  изменения  свойства  $var3  предназначен  метод f_set_var3(). Именно  в  этом методе мы можем проверить  значение на допустимость.

 
Свойство  $var4,  объявленное  с  помощью  ключевого  слова  protected,  не доступно для свободного изменения. Получить доступ к защищенному свойству $var4 можно только через открытый метод f_get_var4(). В отличие от свойства $var3, свойство $var4 доступно внутри класса Class2.

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити