2016-09-05 4 views
0

Я учусь PHP, и я застрял я следующий код:PHP: доступ к защищенному вар из дочернего класса

<?php 

class dogtag { 

    protected $Words; 

} 

class dog { 

    protected $Name; 
    protected $DogTag; 

    protected function bark() { 
     print "Woof!\n"; 
    } 

} 

class poodle extends dog { 

    public function bark() { 
     print "Yip!\n"; 
    } 

} 

$poppy = new poodle; 
$poppy->Name = "Poppy"; 
$poppy->DogTag = new dogtag; 
$poppy->DogTag->Words = "My name is 
Poppy. If you find me, please call 555-1234"; 

var_dump($poppy); 

?> 

Это то, что я получил:

PHP Fatal error: Uncaught Error: Cannot access protected property poodle::$Name 

Это выглядит странно мне, поскольку я должен получить доступ к защищенным vars и функциям из дочерних классов.

Может ли кто-нибудь объяснить, где я ошибаюсь?

Большое спасибо.

ответ

1

Защищенные переменные действительно могут быть доступны из дочернего класса. Однако вы не получаете доступ к своей переменной изнутри дочернего класса.

Если вы делаете переменные public, вы можете получить к ним доступ извне класса.

Документация: http://php.net/manual/en/language.oop5.visibility.php

Пример:

Class Dog { 

    private $privateProperty = "private"; //I can only be access from inside the Dog class 
    protected $protectedProperty = "protected"; //I can be accessed from inside the dog class and all child classes 
    public $publicProperty = "public"; //I can be accessed from everywhere. 

} 


Class Poodle extends Dog { 

    public function getProtectedProperty(){ 
     return $this->protectedProperty; //This is ok because it's inside the Poodle (child class); 
    } 

} 

$poodle = new Poodle; 
echo $poodle->publicProperty; //This is ok because it's public 
echo $poodle->getProtectedProperty(); //This is ok because it calls a public method. 
+0

Спасибо @ Даан, но я не уверен, что получаю. Вы имеете в виду, что я пытаюсь получить к нему доступ из экземпляра ($ poppy) подкласса, а не из определения подкласса (класс poodle extends ...)? – S4rg0n

+0

Это означает, что вы не получаете доступ к нему из класса собаки, а снаружи. – Daan

+0

Мне очень жаль, но я не понимаю. Я пытаюсь получить доступ к $ Name из подкласса пуделя, который наследуется от класса собаки. Я создаю экземпляр пуделя ($ poppy), и я пытаюсь изменить защищенное var $ Name. Я понимаю, что не могу сделать это с помощью частного var, но $ Name защищен. Так как $ poppy - это экземпляр класса poodle, я должен иметь возможность изменять var var защищенного родителя. Благодарим за терпение. – S4rg0n

0

Вы не можете получить доступ к собственности 'Слова', вы должны сделать его публичным

0

можно добавить magic методы в класс - что позволит вам получать доступ к частной собственности и управлять ими извне класса.

class foo{ 
    private $bah; 

    public function __construct(){ 
     $this->bah='hello world'; 
    } 
    public function __get($name){ 
     return $this->$name; 
    } 
    public function __set($name,$value){ 
     $this->$name=$value; 
    } 
    public function __isset($name){ 
     return isset($this->$name); 
    } 
    public function __unset($name){ 
     unset($this->$name); 
    } 
} 

$foo=new foo; 
echo $foo->bah; 

$foo->bah='banana'; 
echo $foo->bah;