Оглавление

Защищенные свойства и методы

Если свойство или метод объявлены как защищенные (protected), то это означает, что доступ к ним возможен только изнутри самого класса или его классов-потомков (классов, которые унаследованы от класса, содержащего защищенный метод).

 
Объявите метод getProperty() как защищенный в классе MyClass и попытайтесь получить к нему доступ извне класса.

 

<?php 
 
class MyClass 
{ 
    public $prop1 = "Это свойство класса!"; 
 
    public function __construct() 
    { 
        echo 'Класс "', __CLASS__, '" тнициирован!<br />';
    } 
 
    public function __destruct() 
    { 
        echo 'Класс "', __CLASS__, '" уничтожен.<br />';
    } 
 
    public function __toString() 
    { 
        echo "Используем метод toString: "; 
        return $this->getProperty(); 
    } 
 
    public function setProperty($newval) 
    { 
        $this->prop1 = $newval; 
    } 
 
    protected function getProperty()                 
    {                                                
        return $this->prop1 . "<br />";              
    }                                                
} 
 
class MyOtherClass extends MyClass 
{ 
    public function __construct() 
    { 
        parent::__construct(); 
                echo "Новый конструктор в классе " . __CLASS__ . ".<br />"; 
    } 
 
    public function newMethod() 
    { 
        echo "Новый меиод в классе " . __CLASS__ . ".<br />"; 
    } 
} 
 
// Создать новый объект
$newobj = new MyOtherClass; 
 
// Попытаться вызвать защищенный метод              
echo $newobj->getProperty();                        
 
?> 


Попытка выполнить этот сценарий приведет к ошибке.

 

Класс "MyClass" тнициирован!
Новый конструктор в классе MyOtherClass.

Fatal error: Call to protected method MyClass::getProperty() from context '' in F:\xampp\htdocs\testing\test.php on line 52


А теперь создайте в классе MyOtherClass новый метод и используйте его для вызова метода  getProperty().

 

<?php  
class MyClass 
{ 
    public $prop1 = "Это свойство класса!"; 
 
    public function __construct() 
    { 
        echo 'Класс "', __CLASS__, '" инициирован!<br />'; 
    } 
 
    public function __destruct() 
    { 
        echo 'Класс "', __CLASS__, '" уничтожен.<br />'; 
    } 
 
    public function __toString() 
    { 
        echo "Используем метод toString: "; 
        return $this->getProperty(); 
    } 
 
    public function setProperty($newval) 
    { 
        $this->prop1 = $newval; 
    } 
 
    protected function getProperty() 
    { 
        return $this->prop1 . "<br />"; 
    } 
} 
 
class MyOtherClass extends MyClass 
{ 
    public function __construct() 
    { 
        parent::__construct(); 
                echo "Новый конструктор в классе " . __CLASS__ . ".<br />"; 
    } 
 
    public function newMethod() 
    { 
        echo "Новый меиод в классе " . __CLASS__ . ".<br />"; 
    } 
 
    public function callProtected()                  
    {                                                
        return $this->getProperty();                 
    }                                                
} 
 
// Создать новый объект 
$newobj = new MyOtherClass; 
 
// Вызвать защищенный метод из общедоступного метода 
echo $newobj->callProtected();                       
?> 
  

Теперь этот сценарий сгенерирует требуемый результат.

 

Класс "MyClass" инициирован!
Новый конструктор в классе MyOtherClass.
Это свойство класса!
Класс "MyClass" уничтожен.
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити