访问覆盖PHP中父类的受保护变量

时间:2011-04-17 18:41:02

标签: php class variables override

您好
如何通过在子类中调用其getter方法来从父类访问覆盖的受保护变量?

例如:

class A{
    protected x='test';
    protected function printx(){
        echo $this->x;
    }
}

class B extends A{
    protected x='test2';

    public function printxs(){
        parent::printx();
        echo "\n";
        echo $this->x;
    }
}

$b=new B;
$b->printsx();

我期待这张照片:

test
test2

但打印出来:

test
test

3 个答案:

答案 0 :(得分:3)

首先,它不会打印test\ntest,而是打印test2\ntest2

当您继承超类时,您正在专门化超类。在我们的示例中,我们将A类与B类进行了专门化。通过该专业化,我们将重新定义受保护对象变量$this->x的值。

当您调用超类'方法printx()时,系统会要求我们将已在子类中重新定义的$this->x的值回显为test2,而不是test

以下是PHPified代码:

<?php

class A {
    protected $x = 'test';
    protected function printx(){
        echo $this->x;
    }
}

class B extends A {
    protected $x = 'test2';

    public function printsx(){
        parent::printx();
        echo "\n";
        echo $this->x;
    }
}

$b=new B;
$b->printsx();

答案 1 :(得分:2)

没有“父”这样的东西,这里:只有一个属性 - 一个内存插槽

即使首先在父类中定义了属性,然后在子类中重新定义,只要您使用对象的属性$this,这里),它总是相同的属性。

答案 2 :(得分:1)

由于您的代码在此处未编译,因此更新了:

<?php 

class A{

    protected $x='I am the value of Class A';

    public function getValueUsingAMethod() {

        return $this->x;

    }


}

class B extends A{

    protected $x='I am the value Class B';

    public function getValueUsingBMethod(){

        return $this->x;
    }

}

$anA = new A();
$aB = new B();

// Will output: B called - I am the value of Class A
echo '<br />B called - ' . $anA->getValueUsingAMethod();

// Will output: A called - I am the value Class B
echo '<br />A called - ' . $aB->getValueUsingAMethod();

// Will output: B called - I am the value Class B
    echo '<br />B called - ' . $aB->getValueUsingBMethod();

// Outputs this
//   object(B)#2 (1) { ["x":protected]=> string(22) "I am the value Class B" } 
var_dump( $aB );

看看第二行输出。您将方法称为A类,并且该方法从B类的对象实例返回值。

如果你通过类B来子类A并且B在A的范围内覆盖变量,那么如果从B的实例调用它们,则所有A的方法都会自动访问被覆盖的变量。

输出的最后一行描述了B的内部结构。如您所见,只有一个实例变量x可用。

为什么呢?

如果你覆盖$ x,语义是'使用我的新$ x而不是原始$ x'。

如果你肯定需要访问A的$ x,你可能希望在B中创建一个不同名称的附加成员变量。