2013-01-11 22 views
1

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

某一类(姑且称之为TestClass中)在系统我正在做这样的事情:

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

我给它一个快速尝试,希望对象的访问成员之间存在一些不一致的行为直接或者通过一些吸气剂来防止这种情况发生。我认为在最坏的情况下,指向现有对象和内部指针(又名$ 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>"; 
?> 

我有望获得1和0时,如果$现在这样指出走向新的对象,而$的TestObject仍然指向原来的最后两个电话,但1在两种情况下都会返回。所以我需要知道重新分配这个$是否做什么,但不是一个坏主意。如果没有,我可以转储该部分的好。所以如果有人知道任何副作用,请告诉。

PS:我完全知道上面的代码没有使用可见性等。原来的系统是用PHP4编写的,所以为什么要打扰: - |

+1

在PHP4中,新运算符没有通过引用返回,因此您必须手动使用引用运算符。 – crush

+2

@crush它不仅仅是一个新的操作符,它是所有对象在写入时都被懒惰的拷贝传递的。 – goat

+0

我没有看到您的课程有任何副作用,但是如果您在php5中尝试了它,它会返回给您通过引用分配$ this对象的错误。这可以很容易地解决。 –

回答

0

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

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

该对象被新创建的内容覆盖。这是由于上面评论中提到的“我穿上我的长袍上的向导帽”写的文字。如果与被迫引用的引用一起使用,则不会发生这种情况。

相关问题