PHP访问父类变量

bd1hkmkf  于 2023-05-16  发布在  PHP
关注(0)|答案(9)|浏览(229)
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'

23c0lvtd

23c0lvtd1#

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的开发,但仍然可以提供您想要的所有功能。

wqsoz72f

wqsoz72f2#

既然是继承的就回显吧

echo $this->bb;
cczfrluj

cczfrluj3#

使用parent::$bb;,尝试检索使用$bb的值定义的静态常量。
相反,请执行以下操作:

echo $this->bb;

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

nhn9ugyo

nhn9ugyo4#

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

vaqhlq815#

$bb在扩展了类A之后现在已经成为类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();
q9rjltbz

q9rjltbz6#

父类的所有属性和方法都在子类中继承,所以理论上你可以在子类中访问它们,但是要注意在你的类中使用protected关键字,因为它在子类中使用时会抛出致命错误。
php.net中所述
属性或方法的可见性可以通过在声明前加上关键字public、protected或private来定义。声明为public的类成员可以在任何地方访问。声明为protected的成员只能在类本身内以及由继承类和父类访问。声明为private的成员只能由定义该成员的类访问。

flmtquvp

flmtquvp7#

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

jaql4c8m8#

通过父类构造函数,可以将数据从子类传递给父类。请看下面的例子,以便更好地理解

<?php

class Student 
{
    public $name;
    function __construct($name){
        $this->name = $name;
    }
}

class Test extends Student
{
    public $age;
    function __construct($name,$age){
        $this->age = $age;
        parent::__construct($name);
    }
}

$obj = new Test("sajib khan" ,21);
echo $obj->name;
echo $obj->age;

?>
h43kikqp

h43kikqp9#

class A {
    private $points = 100;

    public function getPoints() {
        return $this->points;
    }
}

class B extends A {
    protected $points = 70;

    public function getPoints() {
        return parent::getPoints();
    }
}

$element = new B();
echo $element->getPoints();

为测试更改可见性私有或受保护

相关问题