闭包非常有用,尤其是在不需要完整控制器时创建插件时,今天我在类中使用闭包并尝试使用 $this-> 时遇到了一个问题,导致出现此错误:

不在对象上下文中时使用 $this。

问题是 PHP 5.3 不允许你在闭包中使用 $this,以这个例子为例,我有一个带有控制器的方法,我试图使用 $this-> 来引用一个对象。 

public function routes(){

    Router::any('(:all)', function($request) {
        $row = $this->_db->get_post_by_slug($request);
    }

}

在 5.4+ 使用 PHP 5.3 或更低版本时,这将导致错误,它可以正常工作。那么,如果您仍在使用 5.3,为什么?最好升级到最新的稳定版本。

为了使其向后兼容并在 5.3 中工作,变量可以保存对 $this 的引用,并且可以传递/绑定到闭包。
为此,请创建一个变量并将其传递给 $this<

$class = $this;

然后对于闭包,使用 use 函数并将 $class 与 & 一起传递给它不是将其作为引用传递,而是引用实际对象。

Router::any('(:all)', function($request) use (&$class){

重要的部分是使用 (&$class),它使 $class 可用于与 $this 相同的闭包,现在我不再编写 $this->_db,而是像这样编写 $class->_db:

Router::any('(:all)', function($request) use (&$class){
    $row = $class->_db->get_post_by_slug($request);
}

这使得闭包可以在 5.3 中引用主类中的对象,因为 5.4+ 不需要更改并且 $this 可以自由使用。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。