运行此脚本时,我得到了一些奇怪的反应。
<?php
error_reporting(E_ALL);
class A {
protected $varOne = array(
"subVar1" => "",
"subVar2" => "",
"subVar3" => "",
"subVar4" => "",
);
public function init() {
$b = new B();
$b->funTest();
echo( "One Two Three" );
echo( "<br />" );
print_r( $this->varOne );
echo( "<br />" );
}
protected function setValue( $key, $value ) {
$this->varOne[$key] = $value;
}
}
class B extends A {
public function funTest() {
$this->setValue( "subVar1", "21" );
$this->setValue( "subVar2", "22" );
$this->setValue( "subVar3", "23" );
$this->setValue( "subVar4", "24" );
echo( "Four Five Six" );
echo( "<br />" );
print_r( $this->varOne );
echo( "<br />" );
}
}
$a = new A();
$a->init();
现在这里的输出让我很烦恼。
OUTPUT:
Four Five Six // As Expected
Array ( [subVar1] => 21 [subVar2] => 22 [subVar3] => 23 [subVar4] => 24 ) // As Expected
One Two Three // As Expected
Array ( [subVar1] => [subVar2] => [subVar3] => [subVar4] => ) // Wait, WTF?
为什么从A类调用时变量是空的?
此外,当将可见性设置为private时,从B类调用时该变量为NULL / EMPTY。
修改
这个接缝给了我所需的结果,感谢大家的帮助。
<?php
error_reporting(E_ALL);
class A {
protected $varOne = array(
"subVar1" => "",
"subVar2" => "",
"subVar3" => "",
"subVar4" => "",
);
public function init() {
echo( "One Two Three" );
echo( "<br />" );
print_r( $this->varOne );
echo( "<br />" );
$b = new B();
$this->varOne = $b->funTest();
echo( "One Two Three" );
echo( "<br />" );
print_r( $this->varOne );
echo( "<br />" );
}
protected function setValue( $key, $value ) {
$this->varOne[$key] = $value;
}
}
class B extends A {
public function funTest() {
$this->setValue( "subVar1", "21" );
$this->setValue( "subVar2", "22" );
$this->setValue( "subVar3", "23" );
$this->setValue( "subVar4", "24" );
return( $this->varOne );
}
}
$a = new A();
$a->init();
答案 0 :(得分:0)
正如评论所指出的那样:使用new
关键字创建B的新实例,任何引用$this
的内容只会更新B实例中的值,而A中的值保持不变。
要从B中更新A而不复制粘贴方法,您可以执行以下操作。我使用$target
参数调整了代码,因此您可以使用$this
传递funTest
<?php
error_reporting(E_ALL);
class A {
protected $varOne = array(
"subVar1" => "",
"subVar2" => "",
"subVar3" => "",
"subVar4" => "",
);
public function init() {
$b = new B();
$b->funTest($this);
echo( "One Two Three" );
echo( "<br />" );
print_r( $this->varOne );
echo( "<br />" );
}
protected function setValue( $key, $value ) {
$this->varOne[$key] = $value;
}
}
class B extends A {
public function funTest($target) {
$target->setValue( "subVar1", "21" );
$target->setValue( "subVar2", "22" );
$target->setValue( "subVar3", "23" );
$target->setValue( "subVar4", "24" );
echo( "Four Five Six" );
echo( "<br />" );
print_r( $target->varOne );
echo( "<br />" );
}
}
$a = new A();
$a->init();
这会给出您预期的行为:
Four Five Six
Array ( [subVar1] => 21 [subVar2] => 22 [subVar3] => 23 [subVar4] => 24 )
One Two Three
Array ( [subVar1] => 21 [subVar2] => 22 [subVar3] => 23 [subVar4] => 24 )