购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.14 匿名函数

匿名函数由PHP5.3引入,也称为动态函数,在PHP 5.4后有了进一步扩展。下面是一个简单的匿名函数的例子。如代码清单1-23所示:

代码清单1-23 使用匿名函数


<php
$greet = function$name{
    printf"Hello %s\r\n" $name);
}
   >

初看上去很奇怪,其实仔细看与赋值操作很像——如同将一个变量赋值为字符串、整数一样,只不过这次是给一个函数赋值,也就是在后面以分号结束。

从代码中看到,我们调用这个函数直接使用该变量名字增加括号就可以了。由于该函数有一个参数$name,我们将它放在括号里就可以了。


 $greet'World');
 $greet'PHP');
  

有一个更简单使用匿名函数的方式。PHP中的array_map()函数返回用户自定义函数作用后的数组。回调函数接受的参数数目应该和传递给array_map()函数的数组数目一致。也就是说,array_map()函数接收一个函数作为其第一个参数,第二个参数是数组,数组内的每个元素都将使用之前的函数遍历一遍。


function format_names$value{
    //etc
}
array_map'format_names'  $names);
  

上面的代码中,严格来说函数是有名字的。我们再换用匿名函数的方式来处理,格式如下:


array_mapfunction$value)){
    //etc
}$names);
  

这种方式的好处是:相关代码、函数定义与隐式调用结合更紧密,因为直接使用函数,只需要维护匿名函数定义即可。

使用匿名函数的副作用是,有可能出现解释出错。倘若发现这样的错误,可以把函数中的代码放在一个正常的函数体中执行,调试到没有问题为止。

匿名函数可以使用闭包。这种方式在PHP中比较少用,但在JavaScript中会常用到。如果你的PHP版本小于5.3,需要使用如下方式:


$foo = create_function'$x' 'return $x*$x');
$bar = create_function"\$x" "return \$x*\$x");
echo $foo10);
  

PHP 5.3以前版本不支持闭包,变量需要显式声明。代码样式如下:


$x = 3
$func = create_function$z { return $z *= 2 }
echo $func$x); // 打印结果为 6

在PHP 5.3以后,我们就可以使用以下方式了:


$x = 3
$func = function() use&$x { $x *= 2 }
$func();
echo $x // 打印结果为 6

闭包语法要优于create_function(),当我们使用create_function()时,参数和函数体都要显式声明,也就是说在代码运行前,PHP无法解析其语法正确性,需要特别注意单引号、双引号和变量命名规则。

当使用闭包后,PHP可以像检查正常代码一样,对匿名函数进行检查。 e6Kzh30yhQgiylXBNKwm03y2aabjC14sVSVQ8IleS1hlDeUNm2aGlLjZaum93Css

点击中间区域
呼出菜单
上一章
目录
下一章
×