PHPでは、私はすべてのオブジェクトがこのコードでは参照であると仮定します。オブジェクトは参照として動作しません
/**
* adds a master object which affects browse and insert operations
*
* @param \bk\dataset\master|string $cursor
* @param Array $fields
*/
function SetMasterCursor ($cursor, $fields)
{
if (is_object($cursor)) {
$this->master = & $cursor; /** !!!!!! **/
} elseif (is_string($cursor)) {
$this->master = \bk\dataset\master::instance($cursor, null, $this->GetModuleName());
}
$this->_masterfld = $fields;
}
Iは&
オペレータ($this->master = & $cursor
)とリファレンスを使用するPHPを強制する必要があります。私がオペレータを使用しないと、それは不思議な動作です。カーソルクラスのコンストラクタを呼び出しています。だから明らかに単に参照をコピーするだけではありません。 PHP5の$object1 = $object2
と$object1 = & $object2
は同じだと思っていましたが、それは他のタイプ(文字列など)とはちょっと違います。私の仮定が間違っていると感じました。
あなたの例の動作は、私が期待したものです。私の例の問題は$ b = $ a(代入)はコンストラクタ呼び出しを引き起こします。 '$ this-> master = $ cursor'は$ cursorクラスのコンストラクタを呼び出します。 '$ this-> master =&$ cursor'はそうではありません。 – bkilinc
それはコンストラクタを呼び出すのは本当に奇妙です、私は自分でそれをテストすることができるような最小限の作業例を提供できますか?私の答えは、たとえオブジェクトでさえポインタがコピーされ、 "エイリアス"を作成していないので、割り当てによって参照が異なることを指摘しています。 –
これはPHPが動作するだけなので、これを正解として受け入れています。私は、デバッグ中にコンストラクタを2回呼び出すことにこだわりました。しかし、私はそれを複製することはできません。これを引き起こしている他のコードがあるかもしれません。私は複製できるときにここに戻ります。とにかく、この回答は、参考文献、クローニングなどについての事柄をクリアしました。ありがとうございました。 – bkilinc