<?php $anonymousFunc = function($username){ echo $username; }; $anonymousFunc("CommandNotFound 坑否!");
将匿名函数放在普通函数中,也可以将匿名函数返回:这样就构成了一个简单的闭包 :
<?php function closureFunc(){ $anonymousFunc = function(){ echo "CommandNotFound 坑否!"; }; $anonymousFunc();//普通函数内部调用了匿名函数 } closureFunc();//输出: CommandNotFound 坑否!
在匿名函数中引用局部变量 (这里要引用一个 php 的关键字 use
)
<?php function closureFunc(){ $username = 'CommandNotFound 坑否!'; $anonymousFunc = function() use($username){ echo $username; }; $anonymousFunc();//此处调用了匿名函数 } closureFunc();//输出: CommandNotFound 坑否!
在普通函数中返回匿名函数
<?php function closureFunc(){ $username = 'CommandNotFound 坑否!'; $anonymousFunc = function() use($username){ echo $username; }; return $anonymousFunc;// 函数返回匿名函数 } $func = closureFunc(); $func(); //然后调用$func()
返回匿名函数并给匿名函数传参
<?php function closureFunc(){ $username = 'CommandNotFound 坑否!'; $anonymousFunc = function($lover,$skill) use($username){ echo $username.$lover.$skill; }; return $anonymousFunc; } $func = closureFunc(); $func("CommandNotFound","坑否");//CommandNotFound 坑否 CommandNotFound 坑否
使用 PHP 闭包改变上下文引用的变量值
<?php function closureFunc(){ $number = 100; $anonymousFunc = function() use($number) { $number++; echo $number.PHP_EOL; }; echo $number.PHP_EOL; return $anonymousFunc; } $func = closureFunc();// 这里输出100,直接调用本函数的 echo $number.PHP_EOL; 即为100 $func();// 调用函数的返回值 $anonymousFunc $number++ 即为101 $func(); //101 $func();//101
上面的输入结果,发现后面的两个 func() 均返回 101
,值并未发生改变,如果要累积 ++ 的效果, 只要加一个 &
引用符号就可以了(匿名函数内的修改也会影响外部变量),修改下:
<?php function closureFunc(){ $number = 100; $anonymousFunc = function() use(&$number) { $number++; echo $number.PHP_EOL; }; echo $number.PHP_EOL; return $anonymousFunc; } $func = closureFunc();// 这里输出100,直接调用本函数的 echo $number.PHP_EOL; 即为100 $func();// 调用函数的返回值 $anonymousFunc $number++ 即为101 $func(); //102 $func();//103
把匿名函数当作参数传递
<?php //定义普通函数,anonymousFunc 为参数变量 function myFunc($anonymousFunc){ $anonymousFunc("CommandNotFound 坑否"); } myFunc(function($username){ //这里调用普通函数,并把 匿名函数作为参数 传给了myFunc中的$anonymousFunc echo $username; });//输出 CommandNotFound 坑否