我正在练习一些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
答案 0 :(得分:4)
正如您在source code中看到的那样,Application
扩展了Container
,后者又实现了ArrayAccess
:
将访问对象作为数组提供的接口。
实现此接口的类的实例可以像访问数组一样进行访问,这就是$this['exception']
中发生的事情。
答案 1 :(得分:3)
这是因为你发现混淆行的Application
类继承自Container。
Container
class实现ArrayAccess
接口,用于将访问对象作为数组提供。