2016-05-10 13 views
1

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は同じだと思っていましたが、それは他のタイプ(文字列など)とはちょっと違います。私の仮定が間違っていると感じました。

答えて

0

ここで詳細に説明されていますhttp://php.net/manual/en/language.oop5.references.php

「デフォルト」または「参照」によってオブジェクトを渡すの違いがあります。 デフォルトでは、オブジェクトはオブジェクトの識別子をコピーすることによって渡されます。

私は(上記ページの)次のコードは、それが明らかに思う:

<?php 
class Foo { 
    private static $used; 
    private $id; 
    public function __construct() { 
    $this->id = self::$used++; 
    } 
    public function __clone() { 
    $this->id = self::$used++; 
    } 
} 

$a = new Foo; // $a is a pointer pointing to Foo object 0 
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a 
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0 
$a = new Foo; // $a and $c are now references of a pointer pointing to Foo object 1, $b is still a pointer pointing to Foo object 0 

(あなたは私に言わせればそれはかなり醜いですが、それはそれがどのようにあります;))。

+0

あなたの例の動作は、私が期待したものです。私の例の問題は$ b = $ a(代入)はコンストラクタ呼び出しを引き起こします。 '$ this-> master = $ cursor'は$ cursorクラスのコンストラクタを呼び出します。 '$ this-> master =&$ cursor'はそうではありません。 – bkilinc

+0

それはコンストラクタを呼び出すのは本当に奇妙です、私は自分でそれをテストすることができるような最小限の作業例を提供できますか?私の答えは、たとえオブジェクトでさえポインタがコピーされ、 "エイリアス"を作成していないので、割り当てによって参照が異なることを指摘しています。 –

+0

これはPHPが動作するだけなので、これを正解として受け入れています。私は、デバッグ中にコンストラクタを2回呼び出すことにこだわりました。しかし、私はそれを複製することはできません。これを引き起こしている他のコードがあるかもしれません。私は複製できるときにここに戻ります。とにかく、この回答は、参考文献、クローニングなどについての事柄をクリアしました。ありがとうございました。 – bkilinc

関連する問題