2014-09-19 21 views
2

我正在练习一点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['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); 
     } 
    } 
} 

不过,如果我看看“照亮\合同\异常\处理程序”,它只是一个接口。据我所知,你实现一个接口然后使用实现,你不直接调用接口。所以这也有点混乱。

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

回答

4

正如可以在source code看到,Application延伸Container这又实现ArrayAccess

接口提供访问对象作为阵列。

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

相关问题