在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...