奇怪的PHP反应

时间:2016-12-18 06:53:28

标签: php oop variables scope visibility

运行此脚本时,我得到了一些奇怪的反应。

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

1 个答案:

答案 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 ) 
相关问题