在PHP中接受函数作为参数

Cri*_*ian 93 php function

我一直想知道是否可以在PHP中传递函数作为参数; 我想要一些像你在JS编程的东西:

object.exampleMethod(function(){
    // some stuff to execute
});
Run Code Online (Sandbox Code Playgroud)

我想要的是在exampleMethod中的某个地方执行该功能.这可能在PHP?

zom*_*bat 137

如果您使用的是PHP 5.3.0或更高版本,则可能.

请参阅手册中的匿名函数.

在您的情况下,您将定义exampleMethod如下:

function exampleMethod($anonFunc) {
    //execute anonymous function
    $anonFunc();
}
Run Code Online (Sandbox Code Playgroud)

  • 该死的,我知道这是可能的.本来要回答,但想先找一些链接到的文档,并且不知道究竟是什么.好吧,现在我知道我什么时候需要这样做.谢谢. (7认同)
  • 在5.3之前,您可以使用`create_function` (3认同)
  • 你会怎么称呼它?你能给出现有函数的名称吗?例如:`exampleMethod(strpos);` (2认同)

web*_*ave 47

只是要添加到其他人,您可以传递一个函数名称:

function someFunc($a)
{
    echo $a;
}

function callFunc($name)
{
    $name('funky!');
}

callFunc('someFunc');
Run Code Online (Sandbox Code Playgroud)

这将在PHP4中运行.

  • 感谢您展示如何通过名称调用现有函数 (7认同)

Jag*_*age 15

您还可以使用create_function将函数创建为变量并传递它.虽然,我更喜欢匿名功能的感觉.去zombat.


Sai*_*ght 13

只需像这样编码:

function example($anon) {
  $anon();
}

example(function(){
  // some codes here
});
Run Code Online (Sandbox Code Playgroud)

如果你能发明这样的东西(灵感来自Laravel Illuminate)会很棒:

Object::method("param_1", function($param){
  $param->something();
});
Run Code Online (Sandbox Code Playgroud)


小智 6

PHP 版本 >= 5.3.0

示例 1:基本

function test($test_param, $my_function) {
    return $my_function($test_param);
}

test("param", function($param) {
    echo $param;
}); //will echo "param"
Run Code Online (Sandbox Code Playgroud)

示例 2:std 对象

$obj = new stdClass();
$obj->test = function ($test_param, $my_function) {
    return $my_function($test_param);
};

$test = $obj->test;
$test("param", function($param) {
    echo $param;
});
Run Code Online (Sandbox Code Playgroud)

示例 3:非静态类调用

class obj{
    public function test($test_param, $my_function) {
        return $my_function($test_param);
    }
}

$obj = new obj();
$obj->test("param", function($param) {
    echo $param;
});
Run Code Online (Sandbox Code Playgroud)

示例 4:静态类调用

class obj {
    public static function test($test_param, $my_function) {
        return $my_function($test_param);
    }
}

obj::test("param", function($param) {
    echo $param;
});
Run Code Online (Sandbox Code Playgroud)


Nic*_*sai 5

根据@ zombat的回答,最好首先验证匿名函数:

function exampleMethod($anonFunc) {
    //execute anonymous function
    if (is_callable($anonFunc)) {
        $anonFunc();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者从PHP 5.4.0开始验证参数类型:

function exampleMethod(callable $anonFunc) {}
Run Code Online (Sandbox Code Playgroud)