2016-05-14 4 views
-4

PHPではこれを行うことができますか?他の関数のパラメータとしてPHP関数

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のこの関数を呼び出すことができます。

出力されるように

function foo($c) { 
    $c; 

    echo 'done'; 
} 

foo(function() { 
    echo 'test' 
}); 

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 
+3

私はそれはあなたhttp://stackoverflow.com/questions/627775/php-pass-function-as-param-then-call-the-functionを助けて –

+0

それが必要だと思い、このリンクをチェックしてくださいすることができます関数 '$ c()'( 'foo'の本体にある)を実行すると動作します。 – Arjan

+0

@arjan、問題は、関数c()は動的で、私はfoo()に他のコードを注入したいので、$ cの中のどのプロセスであれ、終了したら "done"をエコーし​​ます。 –

答えて

0

を何をやっている'anonymous function'を呼び出すです。匿名(無名なので匿名です)は、それを呼び出す別の関数に渡しています。しかし、実際には起動していません!特に$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+。

+0

申し訳ありませんが、私はあなたが言うことを得られなかった。あなたが私に与えるページでは、これは次のように書かれています: "call_user_func( 'increment'、$ a);" "increment($ a)"のように、関数を直接呼び出すことができる場合はなぜcall_user_func()を使用するのですか? –

+0

@マーセル運営元の質問に誤解していると思います。私は自分のレスポンスを更新しましたが、これは主にあなたの文法上の誤りであることを意味します。 –

+0

AHA!、これは私が言ったこと、私がやったことはあなたのやり方に似ています。しかし、 "execute_closure(function(){"はエラーを返します: "解析エラー:予期しないT_FUNCTIONの構文エラーです"、実際の問題で私の質問を更新します) –

0
 <?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... 
+0

コードが正常に動作しますか?「構文解析エラー:予期しないT_FUNCTION」というエラーが返されるためですか? –

+0

@MarcelAngここで誰かが同じ質問をしているはずです。自分でテストしたい場合は、ここに行きます:https://eval.in/571505 – Poiz

関連する問題