В предыдущих занятиях Вы узнали о таких модификаторах как public и private. Доступ к public свойствам и методам можно получить как изнутри, так и за пределами класса, в то время как к private свойствам и методам можно получить доступ только внутри класса.
Доступ к protected свойствам и методам можно получить изнутри класса и любого класса, расширяющего класс.
Подобно модификаторам доступа public и private, вы добавляете к имени свойства ключевое слово protected, чтобы определить защищенное свойство:
protected $propertyName;
protected function methodName()
{
//...
}
Сначала определите класс Customer с частным свойством $name:
<?php
class Customer
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
}
Далее, определим класс VIP, расширяющий класс Customer. В классе VIP есть метод getFormattedName(), который обращается к свойству $name:
<?php
class VIP extends Customer
{
public function getFormattedName()
{
return ucwords($this->name);
}
}
Далее, создадим экземпляр класса VIP и вызовем метод getFormattedName():
<?php
$alex = new VIP('alex ferguson');
echo $alex->getFormattedName();
PHP выдал следующую ошибку:
PHP Notice: Undefined property: VIP::$name in ...
Поскольку свойство $name является частным (private), вы можете получить к нему доступ только в классе Customer. Чтобы разрешить дочернему классу доступ к свойству $name, вы можете изменить его на защищенное свойство следующим образом:
<?php
class Customer
{
protected $name;
public function __construct($name)
{
$this->name = $name;
}
}
Если Вы снова выполните сценарий, вы увидите следующее:
Alex Ferguson
Рассмотрим пример использования защищенных методов.
Сначала определим класс Customer:
<?php
class Customer
{
protected $name;
public function __construct($name)
{
$this->name = $name;
}
protected function format()
{
return ucwords($this->name);
}
public function getName()
{
return $this->format($this->name);
}
}
Класс Customer имеет защищенное свойство $name и защищенный метод format(). Метод format() возвращает $name с первым символом каждого слова, преобразованным в верхний регистр.
В классе Customer также есть общедоступный метод getName(), который вызывает метод format() для возврата отформатированного имени.
Далее, определим класс VIP, расширяющий класс Customer:
<?php
class VIP extends Customer
{
protected function format()
{
return strtoupper($this->name);
}
}
Класс VIP имеет переопределяющий метод format(), который возвращает $name со всеми символами, преобразованными в верхний регистр. Метод format() также имеет модификатор protected.
Далее, создадим новый экземпляр класса Customer и отобразим имя:
$bob = new Customer('bob allen');
echo $bob->getName(); // Bob Allen
Выход:
Bob Allen
В этом примере метод getName() вызывает метод format() класса Customer и возвращает имя с первым символом каждого слова, преобразованным в верхний регистр.
Наконец, создайте новый экземпляр класса VIP и покажем имя:
$alex = new VIP('alex ferguson');
echo $alex->getName(); // ALEX FERGUSON
Вывод:
ALEX FERGUSON
В заключении: