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