当前位置: 首页 > 后端技术 > PHP

通过几个栗子认识PHP闭包

时间:2023-03-29 16:28:56 PHP

通过几个栗子认识PHP闭包1.栗子1用于回调2.栗子2用于变量赋值3.栗子3来自parentScope继承变量4、栗子的前置条件4、call_user_func_array()和call_user_func()方法的简单理解1.call_user_func——调用第一个参数作为回调函数2.call_user_func_array——调用回调函数,并使用一个数组参数作为回调参数5的函数,栗子4将闭包绑定到指定的对象1.Closure::bindTo—复制当前的闭包对象,绑定指定的$this对象和类作用域。2.Closure::bind—复制一个闭包并绑定指定的$this对象和类作用域。6.参考资料如果你有收获,请加个小star。如果你没有得到任何东西,你可以反对。如果你没有任何收获,你可以反对。如果你没有任何帮助,你可以报告三链接示例代码。本文地址有限。更正,谢谢。所有栗子的输出都用symfony/var-dumpe美化了匿名函数(Anonymousfunctions),也叫闭包函数(closures),它允许临时创建一个没有指定名字的函数。最常用作回调函数(callback)参数的值。当然,还有其他应用程序。匿名函数目前是通过Closure类实现的。1、栗子1作为回调$rs=preg_replace_callback('/-([a-z])/',function($match){returnstrtoupper($match[1]);},'hello-world');转储($rs);//"helloWorld"2.栗子2用于变量赋值$greet=function($name){dump($name);};dump($greetinstanceofClosure);//true$greet('PHP');//《PHP》3.栗子3从父作用域继承变量$message='hello';$example=function()use($message){dump($message);};dump($exampleinstanceofClosure);//真$例子();//"hello"四、栗子的前置条件4、简单理解call_user_func_array()和call_user_func()方法1.call_user_func——调用第一个参数为回调函数的函数call_user_func($function,...$parameter){}该方法接收多个参数,第一个是回调函数,可以是普通函数也可以是闭包函数,后面的参数作为函数回调$rs=call_user_func(function(...$params){返回func_get_args();},1,2,3);转储($rs);//[1,2,3]2。call_user_func_array—调用回调函数,并取一个数组参数作为回调函数的参数或闭包函数,后跟数组参数用作函数回调using$rs=call_user_func_array(function(array$params){returnfunc_get_args();},[1,2,3]);转储($rs);//[1,2,3]5.栗子4在指定对象中绑定闭包楼主的意见是把方法绑定到指定的类上,方法也可以使用类的属性和方法,很适合与__call()魔术方法和call_user_func_array方法一起使用1.Closure::bindTo—复制当前闭包对象,绑定指定的$this对象和类作用域functionbindTo($newthis,$newscope='static'){}1&&$arguments[0]instanceof\Closure){returncall_user_func_array($arguments[0]->bindTo($this),array_slice($arguments,1));}thrownew\InvalidArgumentException("没有这样的方法");}}//测试公共函数testClosureBindTo(){$obj=newClosureBindTo();$this->assertEquals(2,$obj->add(function(array$params){return++$params[0];},[1]));//测试同一个实例$newObj=$obj->test(function(array$params){return$this;},[1]);$this->assertTrue($newObjinstanceof$obj);}2.Closure::bind—复制一个闭包并绑定指定的$this对象和类作用域。staticfunctionbind(Closure$closure,$newthis,$newscope='static'){}绑定函数是bindTomethods[$name]=\Closure::bind($callback,$this,get_class());}publicfunction__call(string$name,array$arguments){if(isset($this->methods[$name])){returncall_user_func_array($this->methods[$name],$arguments);}thrownew\RuntimeException("没有方法[{$name}]");}}//测试公共函数testClosureBind(){$obj=newClosureBind();$obj->addMethod('add',function(array$params){return++$params[0];});$this->assertEquals(2,$obj->add([1]));//测试同一个实例$obj->addMethod('test',function(array$params){返回$this;});$this->assertTrue($obj->test([1])instanceof$obj);}六、参考资料php手册