设置$ this =& $ otherObject会改变什么吗?

时间:2013-01-11 16:08:24

标签: php object reference php4

评论表明我必须澄清我的观点:我是这里的外国代码的开发人员和顾问。我目前的任务是帮助将现有(非常大)的系统从PHP4迁移到Java。在查看代码时,我偶然发现了一段令我困惑的代码。

我正在研究的系统中有些类(我们称之为TestClass)是这样的:

function reload(){
    $newobject = new TestClass();
    $this = $newobject;
}

我快速尝试了一下,期望在直接访问对象的成员之间或通过某些getter之间存在一些不一致的行为,以防这种方式有效。我认为在最坏的情况下,指向现有对象的外部指针和内部对象(也就是$ this)会针对堆的不同部分。
快速测试似乎表明没有任何反应。

知道这是否有任何副作用?

这是我的完整测试:

<?php

ini_set('display_errors', true);

class TestClass{

    var $var1;

    function TestClass(){
        $this->var1 = 0;
    }

    function getVar1(){
        return $this->var1;
    }

    function setVar1($value){
        $this->var1 = $value;
    }

    function reload(){
        $newobject = new TestClass();
        $this = &$newobject;
    }
}

echo "<h3>Creating TestObject</h3>";

$testObject = new TestClass();

echo "Accessing member directly: " . $testObject->var1 . "<br>";
echo "Accessing member via get: " . $testObject->getVar1() . "<br>";

echo "Setting member directly to 1<br>";

$testObject->var1 = 1;

echo "Accessing member directly: " . $testObject->var1 . "<br>";
echo "Accessing member via get: " . $testObject->getVar1() . "<br>";

echo "<h3>Calling reload</h3>";

$testObject->reload();

echo "Accessing member directly: " . $testObject->var1 . "<br>";
echo "Accessing member via get: " . $testObject->getVar1() . "<br>";
?>

如果$ this现在指向新对象,而$ testObject仍然指向原始对象,我希望最后两次调用得到1和0,但在两种情况下都返回1。所以我需要知道$ this的重新分配是否做了什么,只是一个坏主意。如果不是,我可以将这部分转发。因此,如果有人知道任何副作用,请告诉。

PS:我完全清楚上面的代码没有使用可见性等。原始系统是用PHP4编写的,所以为什么要这么麻烦: - |

1 个答案:

答案 0 :(得分:0)

好的,有了同事的暗示,我明白了。如果重新加载功能更改为

function reload(){
    $newobject = new TestClass();
    $this = $newobject;
}

该对象被新创建的内容覆盖。这是由于上面评论中“我穿上我的长袍上的巫师帽”所提到的写作副本。如果与强制逐个引用一起使用,则不会发生任何好事。