2016-05-10 108 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; 
} 

我需要強制PHP與&運營商($this->master = & $cursor)使用參考。如果我不使用操作員,則表現奇怪。它正在調用遊標類的構造函數。所以顯然它不僅僅是複製參考。我以爲,從$object1 = $object2$object1 = & $object2上的PHP5是相同的,它只是不同的其他類型(字符串等)。我有一種感覺,我的假設是錯誤的。

回答

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的行爲。我在調試過程中兩次調用構造函數。但我無法複製它。可能是其他一些代碼造成了這種情況。當我可以複製時,我會回到這裏。無論如何,這個答案清除了有關引用,克隆等的事情。謝謝。 – bkilinc