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

时间:2011-08-08 17:52:49

标签: php oop destructor

  

可能重复:
  Pass reference to $this in constructor PHP

我正在研究一个简单的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()方法时,请求对象中的更改不会更改。在致电print_r()后立即致电_render()时,更改 以某种方式显示......

汇总:我在析构函数中对_request属性所做的任何更改都会在初始请求对象中以某种方式更改,该对象引用相同的对象,因为对象(几乎)总是没有被复制但被引用。我做错了什么?

注意:我在here之前问了一个类似的问题,但问题不够具体(因为我当时没有完全理解这个问题,而且由于我自己做了一些不好的测试)。我想我应该问一个新的,具体的,直接的问题,这样有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

您使用的是什么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'

这和你试图做的一样。如果是......听起来好像应用程序逻辑中的某些其他部分正在干扰。