可能重复:
在构造函数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'
这和你试图做的事情是一样的吗?如果是……听起来可能是你应用程序逻辑的其他部分在干扰。