如何使用带有预定义参数/参数的PHP闭包

时间:2014-12-19 23:30:25

标签: php closures

我想要实现的目标是:

$x = 5;
$b = function ($x) {
    echo 'This should be 5 :' . $x;
};
function a($fn){
    echo 'In a ';
    $fn();
}
a($b);

当你运行这段代码时,我们得到了

  

中      

这应该是5:5

我们得到的是

  

警告:缺少{closure}()的参数1,调用   writecodeonline.com/php在第10行并在第3行定义   是5

我不想重新定义我已定义的论点

我不想要的是隐藏$ x。我不想改变其知名度。

有没有办法呢?

2 个答案:

答案 0 :(得分:2)

阅读文档:您可以使用use表达式:

$x = 5;

$b = function () use ($x) {
    echo 'This is x: ' . $x . "\n";
};

$b();

$c = function ($fn) {
    echo 'In c: ';
    $fn();
};

$c($b);
$x = 10;
$c($b);

输出:

This is x: 5
In c: This is x: 5
In c: This is x: 5

请注意,尽管$x稍后更改,但指定的值不会更改。如果通过引用传递变量,则可以实现此目的:

$x = 5;

$b = function () use (&$x) { // << Note the difference here
    echo 'This is x: ' . $x . "\n";
};

$b();

$c = function ($fn) {
    echo 'In c: ';
    $fn();
};

$c($b);
$x = 10;
$c($b);

输出:

This is x: 5
In c: This is x: 5
In c: This is x: 10

答案 1 :(得分:1)

了解variable scope$x无法在函数a()内自动显示,除非您将参数传递给函数a()

$x = 5;

$b = function ($x) {
    echo 'This should be 5 :' . $x;
};

function a($fn, $value) {
    echo 'In a ';
    $fn($value);
}

a($b, $x);