在 PHP 中通过引用传递函数

php
2022-08-30 13:08:23

是否可以通过引用传递函数?

像这样:

function call($func){
    $func();
}

function test(){
    echo "hello world!";
}

call(test);

我知道你可以这样做,但我真的不想这样做,因为我需要通过引用传递函数。'test'

通过匿名函数执行此操作的唯一方法是什么?

澄清:如果您从C++中回想起,则可以通过指针传递函数:

void call(void (*func)(void)){
    func();
}

或者在Python中:

def call(func):
    func()

这就是我想要完成的。


答案 1

对于它的价值,给这样的东西一个机会怎么样?(是的,我知道这是帖子中提到的一个匿名函数,但我对大量根本没有提到闭包/函数对象的回复感到不满,所以这主要是给跑过这篇文章的人的注释。

我不使用PHP,但是使用闭包似乎在PHP 5.3(但不是PHP 5.2)中起作用,如此处所示我不确定有什么限制,如果有的话。(据我所知,封口会吃掉你的孩子。你已被警告。

function doIt ($fn) {
  echo "doIt\n";
  return $fn();
}

function doMe () {
  echo "doMe\n";
}

// I am using a closure here.
// There may be a more clever way to "get the function-object" representing a given
// named function, but I do not know what it is. Again, I *don't use PHP* :-)
echo doIt(function () { doMe(); });

快乐编码。


答案 2

问题在于,您传递的是调用的函数的返回值,而不是函数本身。call_user_func()

我以前也遇到过这个问题,这是我想出的解决方案。

function funcRef($func){
  return create_function('', "return call_user_func_array('{$func}', func_get_args());");
}

function foo($a, $b, $c){
    return sprintf("A:%s B:%s C:%s", $a, $b, $c);
}

$b = funcRef("foo");

echo $b("hello", "world", 123);

//=> A:hello B:world C:123

ideone.com 演示


推荐