2012-03-01 80 views
1

考慮以下結構:PHP:存儲和/或通過參考

class B 
{ 
    private $_b; 
    private __constructor() { } 

    public function setValue($value) 
    { 
     $this->_b->setValue($value); 
    } 

    public static function load(&$__b) 
    { 
     $B = new B(); 
     $B->_b = $__b; 
     return $B; 
    } 
} 
class A 
{ 
    private $_b; 

    public function getB() 
    { 
     return B::load($this->_b); 
    } 

    public function save() 
    { 
     $this->_b->save(); 
    } 
} 
$_SESSION['a'] = new A(); 

下不起作用:

$b = $_SESSION['a']->getB(); 
$b->setValue('value'); 
$_SESSION['a']->save(); 

但是,下面做工作:

$_SESSION['a']->getB()->setValue('value'); 
$_SESSION['a']->save(); 

我知道這裏有人會看到有什麼不對,或者甚至不可能。

回答

1

究竟是什麼你想在這裏實現什麼?您的測試是否考慮在會話打開/關閉時發生un/serialize過程?

這不應該工作。 A::getB()不更新其保存在A::_b中的參考。 B::load()通過參考接收數據,但不會將其指定給$B->_b。假設$__b本身就是一個對象,這將在PHP5中起作用。不是因爲你通過引用將它傳遞給了load()函數 - 而是因爲對象總是被引用處理的。

也許你想詳細說明你的代碼示例。解釋$_SESSION['a']值是如何成爲一個好的開始。

+0

我添加了如何創建$ _SESSION ['a']'。這在之前做了工作,因爲它是使用引用創建的,所以引用可以工作。底層的'_b'就是所有需要引用的東西,類本身不需要。 – 2012-03-01 18:02:26

+0

對不起,但是'$ a = new A(); $ b = $ a-> getB(); $ b-> setValue(「v」);'會導致致命錯誤'調用非對象方法'。 – rodneyrehm 2012-03-01 18:06:36

0

這個問題是沒有必要,在原來的交代碼工作正是因爲它意(通過按引用),並允許在變量存儲。

我的問題是,在這是迫使它不是一個參考構造函數不正確地修改private $_b