Я изучаю 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
Это выглядит странно для меня, так как я должен получить доступ к защищенным переменным и функциям из дочерних классов.
Может кто-нибудь объяснить, где я не прав?
Большое спасибо.
Защищенные переменные действительно могут быть доступны из дочернего класса. Однако вы не обращаетесь к своей переменной внутри дочернего класса.
Если вы сделаете переменные 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.
Вы не можете получить доступ к свойству «Слова», вам нужно сделать его публичным
Вы могли бы добавить 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;