匿名函数PHP官网是这么定义的:
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。
1.作为回调函数参数的用法
示例1.
<?php
//把字符串中符合这个正则匹配的替换成匿名函数中返回的值
echo preg_replace_callback('/(\d{1})([a-z]{3,})/', function ($match) {
return $match[1].strtoupper($match[2]);
}, '345aaaaa86rrr07aaa');
结果:
345AAAAA86RRR07AAA
2.匿名函数赋值给变量
闭包函数直接赋值给变量,PHP 会自动把此种表达式转换成内置类 Closure
的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号
。
示例2.
$testclosures = function($name) {
echo 'hello '.$name;
}; //此处必须加上分号
$testclosures('vilay');
结果:
hello vilay
3.从父作用域继承变量
闭包可以从父作用域中继承变量。 任何此类变量都应该使用 use
关键字传递进去。
示例3.1(未使用use
):
$name = 'vilay'; //父作用域变量
$testclosures = function() {
echo 'hello '.$name;
};
echo $testclosures();
结果:
Notice: Undefined variable: name in
hello
示例3.2(使用use继承父作用域变量
):
$name = 'vilay';
$testclosures = function() use ($name) {
echo 'hello '.$name;
};
echo $testclosures();
结果:
hello vilay
示例3.3(在匿名函数定义的时候,继承的父作用域变量的值就已经传递过去,而不是在匿名函数调用的时候
):
$name = 'vilay';
$testclosures = function() use ($name) {
echo 'hello '.$name;
};
$name = 'world'; //继承的父作用域变量在函数定义的时候,已经传递过去,因此此处设置变量值无效,结果仍是 hello vilay,而不是hello world
echo $testclosures();
结果:
hello vilay
示例3.4(通过引用继承父作用域的变量
):
$name = 'vilay';
$testclosures = function() use (&$name) {
echo 'hello '.$name;
};
echo $testclosures(); //此处结果应为:hello vilay
$name = 'world';
echo $testclosures(); //此处结果应为:hello world 由于使用了引用,改变了父作用域的变量的值,映射到了函数调用里面
结果:
hello vilayhello world
示例3.5(使用常规的参数
):
$name = 'vilay';
$testclosures = function($args) use ($name) {
echo $args.', '.$name;
};
$testclosures('ninhao');
结果:
ninhao, vilay