我正在练习一些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
接口,该接口用于以数组形式提供访问对象。