2016-08-08 85 views
0
<?php 

class Foo{ 
    public $basket; 

    public function __construct() 
    { 
     $this->basket = 1; 
    } 

    public function getBasket(){ 
     return $this->basket; 
    } 
} 

class Bar{ 
    public function __construct(&$basket) 
    { 
     $basket++; 
    } 
} 

$newFoo = new Foo(); 
$newBar = new Bar($newFoo->getBasket()); 

echo $newFoo->getBasket(); 

?> 

我希望初始化一個類中的$basket值,並通過另一個類操作相同的變量。不幸的是,我不斷收到「注意:只有變量應該通過引用傳遞」的錯誤信息。跨兩個不同的類別引用相同的變量

問題:如何更改代碼以實現此目的?謝謝。

+0

我不會做這樣的事情可以修改購物籃內容,這是不容易保持具有獨特的籃子參考。我會有一個名爲Basket的單獨的類。現在,給Foo和Bar提供籃子的相同實例,並且可以根據需要添加它 - 但訪問是受控的。 [演示在eval.in](https://eval.in/619687)。而且更容易測試,調試和添加新功能。 –

+0

嗨瑞安。好點,我喜歡你在那裏做的。我正在致力於一個MVC在線購物平臺。這個問題的目的是弄清楚如何在PHP的不同頁面之間共享對象(訂單的模型表示)。這是一個單獨的問題,我可能會在近期提出。 – taylorswiftfan

+0

[清晰演示爲eval.in](https://eval.in/619689) - 整理回聲。 –

回答

0

變化

$newBar = new Bar($newFoo->getBasket()); 

$basket = $newFoo->getBasket(); 
$newBar = new Bar($basket); 

第一種方法不起作用,因爲PHP沒有任何變量,用以容納你傳遞到new Bar()結果值,沒有什麼可以通過引用傳遞。

第二種方式工作,因爲$basket變種是在內存中一個固定的參考,因此它可以通過引用傳遞到new Bar()

你問的評論:

已經改變了我的代碼到你的。 echo $ newFoo-> getBasket();產生1 (我希望2)。

1產生,因爲每次調用getBasket()爲您提供了類變量的新鮮副本。我傳遞給new Bar()$basket等於2,但這不是你所呼應的。

如果你想的getBasket()和可變$basket結果是指在內存中相同的參考,你需要做出兩個改變:

更改函數聲明:

public function &getBasket() 

更改如何將功能結果存儲到:

$basket = &$newFoo->getBasket(); 
現在

您的迴音會返回2,因爲你會在你的代碼

See the docs

+0

嗨BeetleJuice,已將我的代碼更改爲上述您的代碼。'echo $ newFoo-> getBasket();'產生'1'(我希望'2')。我能做些什麼才能做到這一點? – taylorswiftfan

+0

你正在尋找'Foo'的'$ basket'變量的增量,這是錯誤的,實際上你需要調用'Bar'的函數來獲得你的代碼的實際工作或沒有。@taylorswiftfan –

+0

@taylorswiftfan你要帶提出與原始問題不同的問題(這是關於您所得到的錯誤)。如果我的代碼解決了這個問題,請選擇並上傳。至於你最後的評論,我已經擴展了我的答案。再看看。 – BeetleJuice

相關問題