2016-11-08 30 views
0

第一代碼,然後這樣的問題:類成員參照PHP另一個目的

class MyArray 
{ 
    private $arrayRef; 

    function __construct(&$array){ 
     $this->arrayRef = $array; 
    } 

    function addElement($newElement){ 
     $this->arrayRef[] = $newElement; 
    } 

    function print(){ 
     print_r($this->arrayRef); 
    } 
} 

$array = ['first', 'second']; 
$arrayObject = new MyArray($array); 
$arrayObject->addElement('third'); 

print_r($array); // prints array containing 2 elements 
echo '<br/>'; 
$arrayObject->print(); // prints array containing 3 elements 

類構件$數組引用,在該示例並不作爲對構造提供的另一陣列的參考工作。構造函數中的參數是通過引用傳遞的,但我想這不會使成員$ arrayRef也是對該數組的引用。

爲什麼不這樣工作,以及如何使它工作?

如果你仍然沒有明白我的意思:首先print_r打印包含2個元素的數組,甚至認爲它可能包含3. 當我通過addElement()傳遞第三個元素到$ arrayObject時,我也希望它添加到我傳遞給類的構造函數的$數組中。

+0

是的,你的構造函數通過引用獲取一個值,但它在行上產生一個本地副本:'$ this-> arrayRef = $ array;'。該類的其餘部分正在處理實例化對象的副本('this-> arrayRef'),而不是原始的'$ array'。你想要一個'全局'變量嗎? – WillardSolutions

+0

我希望成員$ arrayRef是一個對構造函數中傳遞的數組的引用,以便對$ arrayRef所做的任何更改也作出傳遞數組 – Scarass

回答

1

答案其實很簡單。是的,您通過&$array通過引用傳遞數組,但是當您將其分配/複製到成員變量時,此引用會丟失。爲了保持基準,則可以使用=&運營商,像這樣

$this->arrayRef =& $array; 

看到它在this fiddle工作。您可以在this question/answer(只需查找參考)閱讀更多內容。

請注意不要使用&=(它會按位操作)而不是=&(通過引用進行分配)。

+0

好吧,我已按照您的建議修改了該行,但現在我遇到了分配新值到數組,我得到錯誤:不能使用標量值作爲數組。 在調試模式下結束我看到$ arrayRef的值是0. WTF?在構造函數中傳遞的$ array被初始化。 這現在是另一個問題,但我仍然希望你會回答:)。如果不是,還好。 明天會檢查這個錯誤。 – Scarass

+0

對不起,我沒有重寫你的代碼行。我寫了$ this-> arrayRef&= $ array; LOL – Scarass

+1

是的,這很棘手。正如您在回覆中發佈的最後一個鏈接中所看到的那樣,'&='會執行按位操作,而'=&'通過引用進行分配。說實話,使用這樣的引用在PHP中很少見,所以我必須自己查看它(通常只需返回新數組並繼續)。我添加了這個陷阱。如果這回答了您的問題,請考慮將其標記爲已接受 – kero

相關問題