您好
如何通过在子类中调用其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
答案 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中创建一个不同名称的附加成员变量。