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>";
?>

$ testObjectが元のオブジェクトを指しているのに、$ thisが新しいオブジェクトを指している場合、最後の2回の呼び出しで1と0を取得することを期待していましたが、どちらの場合も1が返されます。したがって、$ thisの再割り当てが、悪い考え以外の何かをしているのかどうかを知る必要があります。そうでなければ、私はその部分を永久に捨てることができます。したがって、誰かが副作用を知っている場合は教えてください。

PS:上記のコードが可視性などを使用していないことを十分に認識しています。元のシステムはPHP4で書かれているので、なぜわざわざ:-|

4

1 に答える 1

0

さて、同僚のヒントで私はそれを手に入れました。リロード機能をに変更した場合

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

オブジェクトは、新しく作成されたオブジェクトのコンテンツで上書きされます。これは、上記のコメントで「ローブに魔法使いの帽子をかぶった」と書かれたコピーオンライトによるものです。強制参照による呼び出しで使用した場合、何も起こりません。これは良いことです。

于 2013-01-15T17:51:01.683 に答える