2012-03-01 38 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