1. 自定义函数
(1) 函数调用前不用定义, 除非是有条件的定义
(2) 所有函数都具有全局作用域
(3) 不支持函数重载
(4) 函数名称大小写不敏感( 变量名大小写敏感 )
(5) 参数加 & 将使用引用传参
(6) 可以多传参数, 不能少传
(7) 默认参数可使用数组( 必须为常量表达式 )
(8) 实现可变参数列表( func_num_args, func_get_arg, func_get_args )
function echoln() {
foreach(func_get_args() as $value) {
echo $value;
}
echo '<br />';
}
echoln(1, 2, 3, 4);
// 输出: 1234<br />
2. 匿名函数
(1) 匿名函数通过类 Closure 实现, 每个匿名函数都是个 Clouse 对象
// 模拟实现只能带0个或1个参数的匿名函数对象
class FunctionObject {
private $func;
function __construct($func) {
$this->func = $func;
}
function __invoke($args) {
$func = $this->func;
return $func($args);
}
}
// 调用
$func = new FunctionObject(function($str) {
return print $str;
});
$func('hello world');
// 输出: hello world
(2) PHP 中的匿名函数是种伪闭包, 通过 use() 可以捕捉上下文中的自由变量
$init = 1;
$adder = function($x) use($init) {
return $x + $init;
};
var_dump($adder);
/* 输出:
object(Closure)#1 (2) {
["static"]=> array(1) {
["init"]=> int(1)
}
["parameter"]=> array(1) {
["$x"]=> string(10) ""
}
}
*/
可以看出PHP捕捉自由变量是通过将变量拷贝为对象的 "staitc" 属性实现的
(3) 匿名函数实现递归
// 匿名函数递归实现阶乘
// 假定输入不为负数
$factorial = function($num) use(&$factorial) {
return $num > 0 ? $factorial($num - 1) * $num : 1;
};