php 闭包 function use用法
参考:
https://www.zhihu.com/question/28062458
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <?php $a = 'aac' ; $say = function () use (& $a ) { echo $a ; }; $a = "zzzzzzzzzzz" ; //$say(); //$fib = function($n) use(&$fib){ // if ($n < 2) { // return 1; // } // return $fib($n-1) + $fib($n-2); //}; //echo $fib(22); function fib( $n ) { if ( $n < 2) { return 1; } return fib( $n -1) + fib( $n -2); } $t1 = microtime(true); var_dump(fib(40)); var_dump(fib(41)); $t2 = microtime(true); $fib = array (); $fib [0] = 1; $fib [1] = 1; for ( $i = 2; $i < 42; $i ++) { $fib [ $i ] = $fib [ $i -1] + $fib [ $i -2]; } $t3 = microtime(true); var_dump( $fib [40]); var_dump( $fib [41]); echo "t2-t1:" . round ( $t2 - $t1 , 7). "\n" ; echo "t3-t2:" . round ( $t3 - $t2 , 7). "\n" ; |
----------------------------
PHP 匿名函数 function use 与直接传参的区别
https://blog.csdn.net/gezipml/article/details/83069561
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?php $message = 'hello' ; // 没有 "use" $example = function () { var_dump( $message ); }; echo $example (); // 继承 $message $example = function () use ( $message ) { var_dump( $message ); }; echo $example (); // Inherited variable's value is from when the function // is defined, not when called $message = 'world' ; echo $example (); // Reset message $message = 'hello' ; // Inherit by-reference $example = function () use (& $message ) { var_dump( $message ); }; echo $example (); // The changed value in the parent scope // is reflected inside the function call $message = 'world' ; echo $example (); // Closures can also accept regular arguments $example = function ( $arg ) use ( $message ) { var_dump( $arg . ' ' . $message ); }; $example ( "hello" ); ?> |
-------------------------------------------------------
解除递归函数
-
-
$fib = function($n) use(&$fib) {
-
if($n == 0 || $n == 1) return 1;
-
return $fib($n - 1) + $fib($n - 2);
-
};
-
-
echo $fib(2) . "\n"; // 2
-
$lie = $fib;
-
$fib = function(){die('error');};//rewrite $fib variable
-
echo $lie(5); // error because $fib is referenced by closure
注意上题中的use使用了&,这里不使用&会出现错误$fib($n-1)是找不到function的(前面没有定义fib的类型)
所以想使用闭包解除循环函数的时候就需要使用
-
-
$recursive = function () use (&$recursive){
-
// The function is now available as $recursive
-
}
这样的形式
4 关于延迟绑定
如果你需要延迟绑定use里面的变量,你就需要使用引用,否则在定义的时候就会做一份拷贝放到use中
-
-
$result = 0;
-
-
$one = function()
-
{ var_dump($result); };
-
-
$two = function() use ($result)
-
{ var_dump($result); };
-
-
$three = function() use (&$result)
-
{ var_dump($result); };
-
-
$result++;
-
-
$one(); // outputs NULL: $result is not in scope
-
$two(); // outputs int(0): $result was copied
-
$three(); // outputs int(1)
使用引用和不使用引用就代表了是调用时赋值,还是申明时候赋值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2020-01-06 【转】golang for select 循环跳出
2020-01-06 协程之间数据通信的问题
2020-01-06 【转】Golang 之协程详解
2020-01-06 [转]找到运行的Ubuntu版本对应的内核源码