$app = 'App here';
$fn1 = function($var) use($app){
$fn2($var);
};
$fn2 = function($var) use($app){
echo $var;
};
$fn1('variable');
在上面的例子中,我试图链接/转发多个匿名函数。但是,在下面的行中我收到错误"注意:未定义的变量:fn2"
$fn2($var)
如何实现匿名函数的链接。
答案 0 :(得分:5)
问题是您没有将$fn2
作为参数传递给闭包的use
语句。
请尝试以下代码:
$app = 'App here';
$fn2 = function($var) use($app){
echo $var;
};
$fn1 = function($var) use($app, $fn2){
$fn2($var);
};
$fn1('variable');
答案 1 :(得分:3)
问题是,您的变量$fn2
超出了您的第一个匿名函数的范围。因此,只需将$fn2
的作业放在$fn1
之前,然后按照您在use()
中所做的那样传递变量,例如$fn1 = function($var) use($app, $fn2){
答案 2 :(得分:2)
首先要澄清一些事情,链接是传统上归因于面向对象的范例(,如方法链接),其中一个方法按顺序返回实例将链多个方法调用一起放在每个连续方法的返回值上。
在功能范例中,您正在做的事情通常被称为higher order function - 或其参数采用其他函数或返回函数的函数
现有代码的问题是PHP中的函数不会从全局范围(请参阅variable scoping in PHP)或任何其他块范围隐式导入变量。唯一需要注意的是,当它们在对象上下文中定义时(即在非静态的类方法内),它们确实可以访问$this
或对象实例。 At least as of 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
。
答案 3 :(得分:1)
在使用变量
之前,您需要定义$fn2
编辑:并传递use()
$app = 'App here';
$fn2 = function($var) use($app){
echo $var;
};
$fn1 = function($var) use($app, $fn2){
$fn2($var);
};
$fn1('variable');