PHP访问父类变量

时间:2011-06-23 15:49:07

标签: php class variables parent

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();

问题: 如何在孩子中显示父变量? 预期结果将回应'parent bb'

7 个答案:

答案 0 :(得分:60)

echo $this->bb;

变量是继承的,不是私有的,因此它是当前对象的一部分。


以下是有关使用parent::

的更多信息的请求的其他信息

如果希望从父类添加额外功能,请使用parent::。例如,想象一下Airplane类:

class Airplane {
    private $pilot;

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

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

class Bomber extends Airplane {
    private $navigator;

    public function __construct( $pilot, $navigator ) {
        $this->navigator = $navigator;

        parent::__construct( $pilot ); // Assigns $pilot to $this->pilot
    }
}

通过这种方式,您可以按照开发的DRY principle进行操作,但仍然可以提供所需的所有功能。

答案 1 :(得分:6)

只是回应它,因为它是继承的

echo $this->bb;

答案 2 :(得分:4)

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();`

答案 3 :(得分:3)

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

相反,请执行:

echo $this->bb;

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

答案 4 :(得分:2)

$ bb现在已经成为B类的私有成员,在扩展了受保护的A类之后。

所以你访问$ 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();

答案 5 :(得分:1)

父类的所有属性和方法都在子类中继承,因此从理论上讲,您可以在子类中访问它们,但要注意在类中使用protected关键字,因为它在使用时会引发致命错误儿童班。
php.net

中所述
  

属性或方法的可见性   可以通过加前缀来定义   关键字public的声明,   受保护或私人。班级成员   声明公开可以访问   到处。成员宣布受保护   只能在课堂上访问   本身以及继承和父母   类。成员宣布为私人   只能由那个班级访问   定义成员。

答案 6 :(得分:1)

PHP Accessing Parent Class Protected Variable & Methods
class A {
    protected $bb = 'parent bb';
    protected function sayHello(){
        echo 'Say Hello';
    }
}

class B extends A {
    public function childfunction() {
        echo $this->bb.'<br>'; 
        echo $this->sayHello();
    }
}

$test = new B();
$test->childfunction();