PHP访问父类variables

class A { private $aa; protected $bb = 'parent bb'; function __construct($arg) { //do something.. } private function parentmethod($arg2) { //do something.. } } class B extends A { function __construct($arg) { parent::__construct($arg); } function childfunction() { echo parent::$bb; //Fatal error: Undefined class constant 'bb' } } $test = new B($some); $test->childfunction(); 

问题:如何在小孩中显示父variables? 预期的结果将回应'父母'

 echo $this->bb; 

该variables是inheritance的,不是私有的,所以它是当前对象的一部分。


以下是有关使用parent::更多信息的更多信息:

使用parent::当你想添加额外的function,从父类的方法。 例如,设想一个Airplane类:

 class Airplane { private $pilot; public function __construct( $pilot ) { $this->pilot = $pilot; } } 

现在假设我们想要创build一种新型的也有导航器的飞机。 您可以扩展__construct()方法来添加新的function,但仍然使用父级提供的function:

 class Bomber extends Airplane { private $navigator; public function __construct( $pilot, $navigator ) { $this->navigator = $navigator; parent::__construct( $pilot ); // Assigns $pilot to $this->pilot } } 

通过这种方式,您可以遵循DRY的开发原则 ,但仍可提供您所需的全部function。

 class A { private $aa; protected $bb = 'parent bb'; function __construct($arg) { //do something.. } private function parentmethod($arg2) { //do something.. } } class B extends A { function __construct($arg) { parent::__construct($arg); } function childfunction() { echo parent::$this->bb; //works by M } } $test = new B($some); $test->childfunction();` 

parent::$bb; 您尝试检索用$bb的值定义的静态常量。

相反,做:

 echo $this->bb; 

注意:如果B是唯一调用它的类,则不需要调用parent::_construct 。 不要在B类中声明__construct。

只是回声它,因为它是inheritance

 echo $this->bb; 

$ bb现在已经成为B类的私有成员。

所以你访问$ bb就好像它是B类的一个属性

 class A { private $aa; protected $bb = 'parent bb'; function __construct($arg) { //do something.. } private function parentmethod($arg2) { //do something.. } } class B extends A { function __construct($arg) { parent::__construct($arg); } function childfunction() { echo $this->bb; } } $test = new B($some); $test->childfunction(); 

父类的所有属性和方法都是在子类中inheritance的,所以理论上你可以在子类中访问它们,但要小心使用类中的protected关键字,因为它在子类中使用时会引发致命错误。
如php.net中所提到的

属性或方法的可见性可以通过在声明前加上public,protected或private关键字来定义。 宣布公开的类成员可以随处访问。 声明保护的成员只能在类本身以及inheritance类和父类中访问。 声明为私有的成员只能由定义该成员的类访问。