8

コード:

public function couts_complets($chantier,$ponderation=100){

    function ponderation($n)
    {
        return($n*$ponderation/100); //this is line 86
    }

            ...

    }

私がやろうとしていること:
array_map()のパラメーターとして使用するために、関数A内で関数Bを宣言すること。

私の問題: エラーが発生します:

未定義の変数:熟考[APP \ Model \ Application.php、86行目]

4

4 に答える 4

12

これを試して:

public function couts_complets($chantier,$ponderation=100){

    $ponderationfunc = function($n) use ($ponderation)
    {
        return($n*$ponderation/100);
    }

        ...
    $ponderationfunc(123);
}
于 2012-08-07T08:28:51.727 に答える
2

php 5.3以降、無名関数を使用できます。コードは次のようになります(テストされていないコードの警告):

public function couts_complets($chantier,$ponderation=100) {
    array_map($chantier, function ($n) use ($ponderation) {
        return($n*$ponderation/100); //this is line 86
    }
}
于 2012-08-07T08:28:26.600 に答える
2

現在のコードで$ponderationは、は関数のスコープでカバーされていないため、「未定義」エラーが発生します。

変数を「内部」関数に渡すには、useステートメントを使用します。

function ponderation($n) use($ponderation) {
于 2012-08-07T08:28:40.513 に答える
1

コールバック関数の使用:

PHPで関数をパラメーターとして使用するには、関数の名前を文字列として渡すだけで十分です。

array_map('my_function_name', $my_array);

関数が実際にクラスの静的メソッドである場合は、次のようにパラメーターとして渡すことができます。

array_map(array('my_class_name', 'my_method_name'), $my_array);

関数が実際にクラス内の非静的メソッドである場合は、次のようにパラメーターとして渡すことができます。

array_map(array($my_object, 'my_method_name'), $my_array);

コールバック関数の宣言:

あなたがグローバルな空間で宣言するならば、すべては世界で良くて明確です-誰にとっても。

別の関数内で宣言するとグローバルになりますが、親関数が初めて実行されるまで定義されずCannot redefine function my_callback_function、親関数を再度実行するとエラーが発生します。

ラムダ関数/無名関数として宣言する場合は、表示/使用を許可する上位レベルのスコープ変数を指定する必要があります。

コールバックの呼び出し:

function my_api_function($callback_function) {
    // PHP 5.4:
    $callback_function($parameter1, $parameter2);

    // PHP < 5.3:
    if(is_string($callback_function)) {
        $callback_function($parameter1, $parameter2);
    }
    if(is_array($callback_function)) {
        call_user_func_array($callback_function, array($parameter1, $parameter2));
    }
}
于 2012-08-07T08:32:34.793 に答える