【问题标题】:Pass reference to $this in constructor PHP在构造函数 PHP 中传递对 $this 的引用
【发布时间】:2011-10-21 23:17:09
【问题描述】:

我有一个名为Request 的课程。在该类中的某个时刻,我使用以下代码创建了一个新控制器,并在构造函数中传递了$this:

$controller = new $this->_controllerName($this);

我的控制器构造函数如下:

public function __construct(Request $request) {
    parent::__construct($request);

    // More stuff
}

如果我在此对象或其父对象中修改$request,则最初调用它的对象中的值不会改变。我还尝试将构造函数定义更改为public function __construct(Request &$request) {(如php.net 所述),但这也不起作用。我该如何解决这个问题?

提前致谢!

编辑 1: 问了一些代码,这些代码显示了我对 $request 所做的事情。该类有一个名为_response 的公共属性,它有一个名为_body 的公共属性。在我的一种方法中,我执行以下操作:

$this->_request->_response->_body = $this->_template->_render();

现在,我需要调用方法的请求具有相同的_request 属性,以便我可以获取正文。

我忘了提到我在调用方法后立即取消设置对象,这是一个问题吗?

编辑 2: 正如下面所指出的,它确实有效,但是当我从 __destruct() 函数调用它时,它不知何故不再有效。为什么会这样?

【问题讨论】:

  • 您能否发布一些代码来显示您对 $request 的实际操作?
  • 对象默认是作为引用传递的,所以不需要加&。
  • @GolezTrol,PHP5 OOP 中经常被提及的关键点之一是“对象默认通过引用传递”。这并不完全正确。 (c)PHP手册
  • 我建议尝试“最少的代码有效”的方法,或者,如果一个简单的示例也不起作用,请在此处发布,以便我们尝试修复它。
  • @GolezTrol & 符号在这里没用。是的,我也明白。我注意到它是为了避免其他人在没有大脑的情况下使用您的信息:) 也许有人会阅读手册

标签: php oop reference pass-by-reference


【解决方案1】:

class Request{
    public $var= 'a';
    public $_controllerName='b';
    public function x(){
        $controller = new $this->_controllerName($this);
    }
}
class controller{
    public function __construct(Request $req){
        $req->var='xyz';
    }
}


class b extends controller{
    public function __construct(Request $req){
        parent::__construct($req);
        print $req->var;
        $req->var='LOL';
    }
}

$r=new Request();
$r->x();
print "\n";
print $r->var;

打印

xyz
LOL

所以,这两种情况都很好用

【讨论】:

  • 你是对的!不过,不知何故,我无法操纵 __destruct() 函数中的变量。为什么会这样?
  • @Frog:因为也许你试图操纵的另一个对象已经被破坏了?在操作之前尝试 var_dump 并检查它是否已经存在。
  • @Hakre:我已经尝试过了,它确实存在......最奇怪的是,如果我在析构函数中修改后执行print_r,它实际上会显示我的更改。调用它的类中不再存在更改。我真的不明白。
  • 哪个类“调用”了析构函数?
  • 当我在对象上调用unset() 时,会自动调用析构函数。我知道它••被•• 调用了,我对_request 属性所做的任何更改都不会在初始对象中更改。
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
相关资源
最近更新 更多