PHP 匿名函数链接

PHP anonymous functions chaining

$app = 'App here';


$fn1 = function($var) use($app){
    $fn2($var);
};

$fn2 = function($var) use($app){
    echo $var;
};

$fn1('variable');

在上面的例子中,我试图chain/forward多个匿名函数。但是,在下面一行我收到一个错误 "Notice: Undefined variable: fn2"

$fn2($var)

如何实现匿名函数的链接。

问题是您没有在闭包的 use 语句中将 $fn2 作为参数传递。

试试下面的代码:

    $app = 'App here';

    $fn2 = function($var) use($app){
       echo $var;
    };

    $fn1 =  function($var) use($app, $fn2){
       $fn2($var);
    };

    $fn1('variable');

Here you have your example working in an online php tester.

问题是,您的变量 $fn2 超出了您第一个匿名函数的范围。因此,只需将 $fn2 的赋值放在 $fn1 之前,然后像在 use() 中所做的那样传递变量,例如$fn1 = function($var) use($app, $fn2){

在使用变量

之前需要先定义$fn2

编辑:并在 use()

中传递变量
$app = 'App here';

$fn2 = function($var) use($app){
    echo $var;
};

$fn1 = function($var) use($app, $fn2){
    $fn2($var);
};

$fn1('variable');

首先澄清一些事情,链接传统上归因于面向对象范式如方法链接),其中一个方法 return 是一个实例,以便 链接 多个方法一起调用每个连续方法的 return 值。

函数式范例中,您所做的通常被称为higher order function - 或参数采用另一个函数的函数或 return 函数 .

您现有代码的问题是 PHP 中的函数不会从全局范围隐式导入变量(请参阅 variable scoping in PHP) or any other block scope. The only caveat being that they do gain access to $this or the object instance when they are defined within object context (i.e. inside of a class method that is not static). 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.