鉴于以下结构:
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();
我知道有人在这里会看到什么是错的,或者甚至不可能。
答案 0 :(得分:1)
你到底想要达到什么目的?考虑到打开/关闭会话时发生的取消/序列化过程,您的测试是否正确?
这不应该奏效。 A::getB()
不会更新A::_b
中保留的引用。 B::load()
通过引用接收数据,但不会将其重新分配给$B->_b
。假设$__b
本身就是一个对象,这将在PHP5中起作用。不是因为你通过引用将它传递给了load()函数 - 而是因为对象总是被引用处理。
也许你想详细说明你的代码示例。解释价值$_SESSION['a']
如何成为一个好的开始。
答案 1 :(得分:0)
这个问题不需要,原帖中的代码完全按预期工作(通过引用传递),并允许存储在变量中。
我的问题是在构造函数中错误地修改了private $_b
,这迫使它不能作为参考。