PHP - 使用参数作为参数传递函数

时间:2018-01-27 06:53:43

标签: php callback arguments anonymous-function

我有几个具有不同数量参数的可互换函数,例如:

function doSomething1($arg1) {
    …
}

function doSomething2($arg1, $arg2) {
    …
}

我想将一些带有参数的函数传递给另一个处理函数,例如:

function doTwoThings($thing1, $thing2) {
    $thing1();
    $thing2();
}

显然这种语法不正确,但我认为这是我的观点。处理函数将被称为:

doTwoThings(‘doSomething1(‘abc’)’, ‘doSomething2(‘abc’, ‘123’));

所以问题是,这实际上是如何完成的?

从我的研究中听起来我可能能够在匿名函数中“包装”“doSomething”函数调用,完成参数并将这些“包装”函数传递给“doTwoThings”函数,并且因为匿名函数在技​​术上没有参数,他们可以在第二个代码片段中以上面显示的方式调用。 PHP文档让我困惑,我发现的所有例子都没有把所有内容放在一起。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

你可以使用call_user_func_array()进行回调(例如运行函数或类方法)和参数作为数组。

http://php.net/manual/en/function.call-user-func-array.php

func_get_args()表示您可以提供此功能和任意数量的参数。

http://php.net/manual/en/function.func-get-args.php

domanythings(
  array( 'thingonename', array('thing','one','arguments') ),
  array( 'thingtwoname', array('thing','two','arguments') )
);

funciton domanythings()
{
  $results = array();
  foreach( func_get_args() as $thing )
  {
     // $thing[0] = 'thingonename';
     // $thing[1] = array('thing','one','arguments')
     if( is_array( $thing ) === true and isset( $thing[0] ) and is_callable( $thing[0] ) )
     {
       if( isset( $thing[1] ) and is_array( $thing[1] ) )
       {
         $results[] = call_user_func_array( $thing[0], $thing[1] );
       }
       else
       {
         $results[] = call_user_func( $thing[0] );
       }
     }
     else
     {
       throw new Exception( 'Invalid thing' );
     }
  }
  return $results;
}

这与做

相同
thingonename('thing','one','arguments');
thingtwoname('thing','two','arguments');