PHP:从子类访问受保护的变量
Posted
技术标签:
【中文标题】PHP:从子类访问受保护的变量【英文标题】:PHP: Accessing protected var from child class 【发布时间】:2017-01-12 12:22:24 【问题描述】:我正在学习 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
这对我来说很奇怪,因为我应该从子类访问受保护的变量和函数。
谁能解释一下我哪里错了?
非常感谢。
【问题讨论】:
【参考方案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.
【讨论】:
谢谢@Daan,但我不确定我明白了。你的意思是我试图从子类的实例($poppy)而不是从子类定义(类贵宾犬扩展......)访问它? 这意味着您不是从狗类内部访问它,而是从外部访问它。 我很抱歉,但我不明白。我正在尝试从继承自 dog 类的 poodle 子类访问 $Name 。我创建了一个贵宾犬 ($poppy) 的实例,并尝试更改受保护的 var $Name。我知道我不能使用私有 var 执行此操作,但 $Name 是受保护的。因此,由于 $poppy 是贵宾犬类的一个实例,我应该能够修改受保护的父母的 var。感谢您的耐心等待。 我已经添加了一个示例,希望这可以解决问题。 非常感谢,现在我明白了!祝你有美好的一天。,【参考方案2】:您无法访问“Words”属性,您需要将其公开
【讨论】:
【参考方案3】:您可以将 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;
【讨论】:
以上是关于PHP:从子类访问受保护的变量的主要内容,如果未能解决你的问题,请参考以下文章