$ this [' key'] - > method() - 这是什么?

时间:2014-09-19 17:10:48

标签: php laravel-4

我正在练习一些PHP OO,我没有积极地使用它,所以我有点创建自己的API来创建网站。我是Laravel的忠实粉丝,我一直在使用它作为参考来开发它,并在此过程中学习更多PHP和OO,但现在我已经碰壁了。

我正在尝试在我的“API”中构建一个异常处理程序来处理404错误等。我查看了Laravel,你就是这样做的:

App::missing(function($exception)
{
    return Response::view('errors.missing', array(), 404);
});

所以,它正在使用回调,我去看看Laravel用它做了什么,这就是问题:我无法理解它是如何工作的。

可以在此处找到代码:https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Application.php

我会把我正在研究的东西放进去:

/**
 * Register a 404 error handler.
 *
 * @param  \Closure  $callback
 * @return void
 */
public function missing(Closure $callback)
{
    $this->error(function(NotFoundHttpException $e) use ($callback)
    {
        return call_user_func($callback, $e);
    });
}

到目前为止,我可以理解,但是有$this->error(....);所以让我们看看:

/**
 * Register an application error handler.
 *
 * @param  \Closure  $callback
 * @return void
 */
public function error(Closure $callback)
{
    $this['exception']->error($callback);
}    

这个我无法理解。 $this是一个引用自身的对象,但它被索引引用,就像在数组中一样?而且,它正在调用一种方法。

对不起,这是我第一次看到这个。你如何使$ this作为一个数组工作?更进一步,用它调用一个方法?我一直在谷歌搜索它,但我找不到这个名字,或者它是什么。

我相信,在本课程中,还有与$this['exception']->error($callback);相关的内容:

/**
 * Register the core class aliases in the container.
 *
 * @return void
 */
public function registerCoreContainerAliases()
{
    $aliases = array(
        '...' => '...', // other stuff
        'exception'      => 'Illuminate\Contracts\Exception\Handler',
        '...' => '...', // other stuff  
    );

    foreach ($aliases as $key => $aliases)
    {
        foreach ((array) $aliases as $alias)
        {
            $this->alias($key, $alias);
        }
    }
}

但是,如果我看一下'Illuminate \ Contracts \ Exception \ Handler',它只是一个界面。据我所知,你实现了一个接口,然后使用实现,你不直接调用接口。所以这也有点令人困惑。

Handler类的链接:https://github.com/laravel/framework/blob/master/src/Illuminate/Contracts/Exception/Handler.php

2 个答案:

答案 0 :(得分:4)

正如您在source code中看到的那样,Application扩展了Container,后者又实现了ArrayAccess

  

将访问对象作为数组提供的接口。

实现此接口的类的实例可以像访问数组一样进行访问,这就是$this['exception']中发生的事情。

答案 1 :(得分:3)

这是因为你发现混淆行的Application类继承自Container。

Container class实现ArrayAccess接口,用于将访问对象作为数组提供。