[英]PHP anonymous functions chaining
$app = 'App here';
$fn1 = function($var) use($app){
$fn2($var);
};
$fn2 = function($var) use($app){
echo $var;
};
$fn1('variable');
在上面的例子中,我试图链接/转发多个匿名函数。 但是,在下面的行中我收到错误“通知:未定义的变量:fn2”
$fn2($var)
如何实现匿名函数的链接。
问题是你没有将$fn2
作为闭包的use
语句中的参数传递。
请尝试以下代码:
$app = 'App here';
$fn2 = function($var) use($app){
echo $var;
};
$fn1 = function($var) use($app, $fn2){
$fn2($var);
};
$fn1('variable');
问题是,你的变量$fn2
超出了你的第一个匿名函数的范围。 所以只需将$fn2
的赋值放在$fn1
之前,然后像你在use()
那样传递变量,例如$fn1 = function($var) use($app, $fn2){
只是首先澄清一些事情,链是传统的东西归因于面向范式对象 ( 如在方法链 ),其中一个方法,以便返回一个实例,以链的多个方法在每一个连续的方法的返回值调用在一起。
在函数范例中 ,您正在做的事情通常被称为高阶函数 - 或者其参数采用另一个函数或返回函数的函数 。
现有代码的问题在于PHP中的函数不会从全局范围隐式导入变量(请参阅PHP中的变量作用域 )或任何其他块作用域。 唯一需要注意的是,当它们在对象上下文中定义时(即在非静态的类方法内),它们确实可以访问$this
或对象实例。 至少从PHP 5.4开始 。
因此,您必须使用use
语句显式地从闭包之外的全局或局部作用域导入变量,该语句用于导入示例中的变量$app
。 但是,导入变量触及外部范围的变量可能并不总是在功能范例内的优雅解决方案,假设这是你想要的。
因此,在更高阶函数的本质中,您可以通过以下方式更简洁地表达您的代码......
$app = 'App here';
$fn1 = function($fn2, $var) use($app){
$fn2($var);
};
$fn2 = function($var) use($app){
echo $var;
};
$fn1($fn2, 'variable');
哪个会给你输出variable
。
在使用变量之前,需要定义$fn2
编辑:并在use()
传递变量
$app = 'App here';
$fn2 = function($var) use($app){
echo $var;
};
$fn1 = function($var) use($app, $fn2){
$fn2($var);
};
$fn1('variable');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.