PHP函数作为另一个函数的参数


PHP function as parameter of another function

在PHP中我们能做到这一点吗?

function foo($c) {
  $c;
  echo 'done';
}
foo(function() {
  echo 'test'
});

这样输出将是:

testdone

这是我真正的问题:

function create_transaction($obj, $func, $errorMsg)
{
  try {
    $obj->transaction('START');
    $func();
    $obj->transaction('COMMIT');
  } catch(Exception $e) {
    $obj->transaction('ROLLBACK');
    throw new exception($errorMsg . ' ---> ' . $e);
  }
}

所以我可以这样调用create_transaction的函数:

create_transaction($obj, function() {
  echo 'test';
  // this should be a database CRUD process
  // to make it simple, i just put echo.
}, 'error');

create_transaction()将在START和COMMIT之间插入函数代码。

但这种方式返回一个错误:

Parse error: syntax error, unexpected T_FUNCTION

这个错误在我写的地方:

create_transaction($obj, function() { // Error here

您正在做的是调用一个"匿名函数"。您正在将匿名(因为它未命名,所以是匿名的)传递给另一个调用它的函数。然而,您实际上并没有调用它!特别是因为您对$c;而不是$c()进行了编码。

如预期:

<?php
function execute_closure($f) {
  echo "Before executing enclosure.'n";
  $f(); //The parens cause php to execute the function
  echo "After executing enclosure.'n";
}
execute_closure(function() {
  echo "Executing enclosured function.'n";
});

将其放在一个名为callfunction.php的文件中并执行它会产生:

$ php callfunction.php  
Before executing enclosure. 
Executing enclosured function. 
After executing enclosure.

最后要注意的是:匿名函数只能在PHP 5.3+中工作。

        <?php
            function foo($c) {
                // CALL THE CALLABLE HERE INSTEAD
                try{
                    $strVal = $c();
                    if(is_string($strVal)){
                        echo $strVal . 'done';
                    }else{
                        // YOUR FUNCTION IS NOT RETURNING A STRING: CATCH & HANDLE THAT CASE:
                        echo "The passed-in Argument Must return a String value...";
                        return false;
                    }
                }catch(Exception $e){
                    // HANDLE THE EXCEPTION YOUR WAY.
                    echo "The passed-in Argument Must be a Callable Function and should return a String value...";
                }
            }
            foo(function() {
                //RETURN THE VALUE HERE!!!
                return "test";
            });
            // SHOULD ECHO BACK 'testdone' TO THE OUTPUT STREAM...