Доступ к защищенным элементам может осуществляться методами своего класса и любого порожденного класса. Общедоступные свойства позволяют обходить принципы инкапсуляции, так как они позволяют подклассам при написании непосредственно зависеть от конкретного свойства. Однако защищенные методы предоставляют меньшую угрозу, и их можно рассматривать как методы, предназначенные только для экспертов. Подклассы, использующие защищенные методы, должны также знать своих "предков".
В листинге 6.9 код из листинга 6.8 доработан таким обратом, что он включает подкласс Widget с именем Thing. Заметим, как Widget сейчас включает метод getName. Вызов этого метода из экземпляра Widget не разрешен, и конструкция $w1->getName() дает ошибку. Однако метод getName внутри подкласса Thing может вызывать этот защищенный метод. Конечно, это очень упрощенный пример для того, чтобы доказать, что Widget::getName защищен. На практике использование защищенных методов в процедурах делается в предположении о полном понимании программистом внутренней структуры объекта с целью обеспечить функциональность, которой можно воспользоваться вне класса.

| Листинг 6.9. Защищенные элементы_
<?php
class Widget
{
private $name; private $price; private $id;
public function __construct($name, $price) 
{
$this->name = $name; $this->price = floatval($price); $this->id = uniqid();
}
//проверка идентичности двух заготовок public function equals($widget)
{
return(($this->name == $widget->name)AND ($this->price == $widget->price));
}
protected function getName()
{
return($this->name);
}
}
class Thing extends Widget
{
private $color;
public function setColor($color)
{
$this->color = $color;
}
public function getColor()
{
return($this->color);
}
public function getName()
{
return(parent::getName());
}
}
$w1 = new Widget('Cog', 5.00); $w2 = new Thing('Cog', 5.00); $w2->setColor('Yellow');
//TRUE (по-прежнему!) if($w1->equals($w2))
{
print("w1 и w2 идентичны <br>n");
}
// распечатать Cog print($w2->getName());
?>

 Существует возможность изменить присвоенный элементу тип доступа, перекрыв его вновь объявленным типом доступа, но здесь имеются некоторые ограничения. При перекрытии общедоступного элемента класса он по-прежнему останется общедоступным в порожденном классе. При перекрытии защищенного элемента класса он может остаться защищенным или стать общедоступным. Частные элементы остаются видимыми только в пределах своих локальных классов. Объявление элемента с именем, совпадающим с именем порождающего класса, создает в этом классе конкретный элемент. Поэтому технически нельзя перекрывать частные элементы. У вас будет возможность присвоить им любой нужный тип доступа. Ключевое слово final предоставляет еще одну возможность ограничить доступ к методу элемента. Порожденные классы не могут перекрывать методы, отмеченные как final, ни в одном из их "предков". Ключевое слово final не применимо к свойствам.