在PHP中将函数作为另一个函数的参数传递

3
我希望你能将一个函数(不是函数的结果)作为另一个函数的参数传递。比如说,我有以下代码:

function double_fn($fn)

我想运行给定的函数($fn)两次。PHP中有这样的机制吗?我知道在Python中,函数是一种变量,但PHP是否类似?

@编辑 是否有类似的方法可以使用方法(method)?

function double_fn(parrot::sing())
3个回答

3
自从5.3版本(注意),使用闭包很自然地实现了这个功能:
function double_fn(callable $fn)
{
    $fn();
    $fn();
}

double_fn(function() {
    echo "hi";
});

(注意) 仅从5.4版本开始支持类型提示

可调用类型可以是以下几种:

  1. 一个字符串,包括要调用的函数名称,
  2. 闭包(如上所述),
  3. 一个由类(或实例)和要调用的方法组成的数组。

上述内容的示例在手册中有详细说明。

更新

是否有类似的方法使用方式?

function double_fn(parrot::sing())

这样做将传递 parrot::sing() 的结果到该函数中。要传递对静态方法的“引用”,您需要使用以下其中之一:

double_fn('parrot::sing');
double_fn(['parrot', 'sing']);

3

这有点不同。将函数名作为字符串传递。

function foo()
{
  echo "foobar\n";
}

function double_fn($fn)
{
  $fn();
  $fn();
}

double_fn('foo');

你是不是自从5.3版本以来就躲在石头下面了? :) - Ja͢ck
1
@Jack:为什么我要定义一个只调用另一个函数的匿名函数? - Ignacio Vazquez-Abrams
谁说匿名函数不能调用另一个函数? - Ja͢ck

1

您可以在 PHP 5.3.0 中使用引入的 匿名函数

function double_fn($fn) {
  $fn();
}


double_fn(function(){
  // fonction body
});

或者:

$myFn = function(){
  // fonction body
};

double_fn($myFn);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接