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


$this['key']->method() - what is this?

我正在练习一些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",它只是一个接口。据我所知,你实现一个接口然后使用实现,你不直接调用接口。所以这也有点令人困惑。

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

正如你在源代码中看到的,Application扩展了Container进而实现ArrayAccess

以数组形式提供访问对象的接口。

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

这是因为您在其中发现混淆行Application类是从容器继承而来的。

Container类实现ArrayAccess接口,该接口用于以数组形式提供访问对象。