对象__destruct()中的修改未保存PHP


Modifications in object __destruct() not saved PHP

可能重复:
在构造函数PHP 中传递对$this的引用

作为一个学习项目,我正在开发一个简单的PHP框架。我有一个请求对象,它的方法叫做_execute()。在这个方法中,我(除其他外(创建了一个名为pageController的对象,调用它上的一个方法,并使用以下代码删除该对象:

$controller = new $this->_controllerName($this);
call_user_func(array($controller, $this->_methodName));
unset($controller);

如您所见,我将当前对象传递给新pageController的构造函数。我的构造函数如下:

public function __construct(Request $request) {
    parent::__construct($request);
    // More stuff
}

家长的控制器是这样的:

public function __construct(Request $request) {
    $this->_request = $request;
}

这一切都很好,但我的析构函数有问题。在pageController中,我还有另外两种方法:

public function __destruct() {
    $this->_render();
}
public function _render($templateName = 'default') {
    $this->_request->_response->_body = $this->_template->_render();
}

如果我从pageController中的另一个方法中调用_render()方法,那么它的工作效果很好:然后我可以使用$this->_response->_body从初始请求对象中获取响应主体。但是,当我从析构函数调用_render()方法时,请求对象中的更改不会更改。当我在调用_render()之后立即调用print_r()时,更改在某种程度上是可见的。。。

摘要:我在析构函数中对_request属性所做的任何更改都不会在引用相同对象的初始请求对象中更改,因为对象(几乎(总是不被复制而是被引用。我做错了什么?

注意:我之前也问过类似的问题,但这些问题不够具体(因为当时我还没有完全理解这个问题,这要归功于我自己的一些糟糕测试(。我想我应该问一个新的、具体的、直接的问题,这样有人就能帮助我了。

您使用的PHP版本是什么?我无法用以下代码在5.3.6上复制您的问题:

class Foo {
    public function __construct(Bar $bar) {
        $this->bar = $bar;
    }
    public function __destruct() {
        $this->bar->value = 'set by Foo::__destruct';
    }
}
class Bar {
    public function __construct() {
        $this->value = 'set by Bar::__construct';
    }
}
$bar = new Bar();
$foo = new Foo($bar);
print $bar->value . PHP_EOL;  // => 'set by Bar::__construct'
unset($foo);
print $bar->value . PHP_EOL;  // => 'set by Foo::__destruct'

这和你试图做的事情是一样的吗?如果是……听起来可能是你应用程序逻辑的其他部分在干扰。