コメントは、私が自分の主張を明確にする必要があることを示しています。私はここで外国のコードに取り組んでいる開発者およびコンサルタントです。私の現在の任務は、既存の(非常に大規模な)システムを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>";
?>
$ testObjectが元のオブジェクトを指しているのに、$ thisが新しいオブジェクトを指している場合、最後の2回の呼び出しで1と0を取得することを期待していましたが、どちらの場合も1が返されます。したがって、$ thisの再割り当てが、悪い考え以外の何かをしているのかどうかを知る必要があります。そうでなければ、私はその部分を永久に捨てることができます。したがって、誰かが副作用を知っている場合は教えてください。
PS:上記のコードが可視性などを使用していないことを十分に認識しています。元のシステムはPHP4で書かれているので、なぜわざわざ:-|