为什么我不能按值分配$ this,它通常是通过引用分配的?

时间:2016-10-22 04:34:00

标签: php class oop object pass-by-reference

以下代码解释了我遇到的问题,我正在尝试按值将$this分配给变量但是它最终通过引用分配,为什么?我该怎么办?

以下脚本是两个类TestTestQuery的集合。 Test假定$num属性中的值,然后脚本调用Test->exist(),创建两个变量:$original“按值”和$obj按引用,在这一点都是一样的。最后脚本调用TestQuery->doit( $obj );如果TestQuery的值为2,则$code会修改$obj的{​​{1}},但结果无效,因为$num的值是$original $obj方法中的exist()与新方法相同。

<?php

class TestQuery{
    public function doit( &$obj )
    {
        if ($obj->getNum() == 2)
            $obj->setCode( 55 );
    }
}

class Test {
    public $code;
    public $num;

    public function setCode( $code ) { $this->code= $code; }
    public function getCode( $code ) { return $this->code; }

    public function getNum()
    {
        return $this->num;
    }

    public function exist()
    {
        $original = $this;
        $obj =& $this;

        // The same objects ...(valid)
        echo "<xmp>";
        print_r( $original );
        echo " VS ";
        print_r( $obj );
        echo "</xmp>";

        $tc = new TestQuery();
        $tc->doit( $obj );

        // The same objects newly... (invalid, hoping different) 
        echo "<xmp>";
        print_r( $original );
        echo " VS ";
        print_r( $obj );
        echo "</xmp>";
    }

}

$t = new Test();
$t->num = 2;
$t->exist();

exit;

?>

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是使用 git checkout -b temp public/master git merge --squash dev # since merge --squash does not produce a commit: git commit -m "squash dev" git push public temp:master git checkout dev git branch -d temp 关键字。

clone