我正在练习一点 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”,它只是一个接口(interface)。据我所知,你实现一个接口(interface)然后使用实现,你不直接调用接口(interface)。所以这也有点令人困惑。
处理程序类的链接:https://github.com/laravel/framework/blob/master/src/Illuminate/Contracts/Exception/Handler.php
最佳答案
正如您在 source code 中看到的那样, Application
扩展 Container
依次实现 ArrayAccess
:
Interface to provide accessing objects as arrays.
可以像访问数组一样访问实现此接口(interface)的类的实例,这就是 $this['exception']
中发生的情况。
关于php - $this ['key' ]->method() - 这是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25939109/