1

评论表明我必须澄清我的观点:我是一名开发人员和顾问,在这里从事外国代码的工作。我目前的任务是帮助将现有的(非常大的)系统从 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 编写的,所以为什么要麻烦 :-|

4

1 回答 1

0

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

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

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

于 2013-01-15T17:51:01.683 回答