Laravel框架之所以被称为优雅的框架,是因为他在框架中使用大量的PHP新语法,包括命名空间、匿名函数、反射机制、后期静态绑定等,才使得Laravel框架显得简洁易扩展。
匿名函数
匿名函数(Anonymous functions)也叫闭包函数(Closure),即一个没有指定名称的函数,经常用作回调函数参数(callback)的值。
1、匿名函数的使用
通常我们在调用函数时,传入的参数是数据,那么只能通过参数对函数的结果进行控制,无法控制其过程,而匿名函数的存在既可以作为参数传给函数,也可以作为变量赋值,进行控制函数的执行过程,因此,匿名函数的引入增强了程序编写的灵活性,可以实现更加高效的设计方案。下面给出相应的实例:
<?php
$array = array(1,2,3,4);
//array_walk 使用用户自定义函数对数组中的每个元素做回调处理
array_walk($array, function($value){echo $value});
输出: 1 2 3 4
匿名函数的另一个作用是可以从父作用域中继承变量,即匿名函数在定义的时候如果需要使用作用域外的变量,可以使用use关键字来继承作用域外的变量,具体实例如下:
<?php
function getCounter() {
$i = 0;
return function() use($i) {
echo ++$i;
};
}
$counter = getCounter();
$counter();
$counter();
输出:1 1
2、Laravel框架中的应用
在Laravel框架中大量地使用了匿名函数,如在服务提供者注册过程中,通过将服务名称与提供服务的匿名函数进行绑定,在使用时可以实现动态服务解析。这里所有的服务可以通俗地理解为一种资源的提供,这个字段可以是一个类的实例、一个路径或是一个文件等,提供服务就是提供一种资源。具体实例如下:
文件 Illuminate\Routing\ControllerServiceProvider.php
<?php
namespace Illuminate\Routing;
use Illuminate\Support\ServiceProvider;
class ControllerServiceProvider extends ServiceProvider
{
//注册服务提供者
public function register()
{
$this->app->singleton('illuminate.route.dispatcher', function($app){
return new ControllerDispatcher($app['router'], $app);
});
}
}
从上面例子中可以看出,这里的$this->app->singleton()函数的作用是将服务名illuminate.route.dispatcher与后面的提供服务的匿名函数绑定起来,用于服务解析,服务就是通过匿名函数实现的。