PHP: доступ к защищенному var из дочернего класса

Я изучаю 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

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

Может кто-нибудь объяснить, где я не прав?

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

0

Решение

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

Если вы сделаете переменные 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.
1

Другие решения

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

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;
0
По вопросам рекламы [email protected]