2017-11-22 7 views
2

Javascriptでは、ファーストクラスの値なので、関数を渡すために使用されています。私はちょうど私ももっと簡潔addを好む、ラムダ$add = function ($m, $n) {return $m + $n;}を割り当てることができます知っているファンクション名リテラルを上位関数に渡すことは安全ですか?

function fold($f, $acc) { 
    return function ($xs) use ($f, &$acc) { 
    return array_reduce($xs, $f, $acc); 
    }; 
} 

function add($m, $n) {return $m + $n;}; 

fold(add, 0) ([1, 2, 3]); 

: - しかし、PHPで私は予告「を 『追加』を想定未定義の定数アドオンの使用」を取得します。これは安全ですか、私は長期的には運命ですか?

+0

PHP 7.2での警告に変更されますのでご注意するだけで簡単に補遺: '(「追加」)倍'。 –

答えて

3

PHP関数はそれほど「ファーストクラス」ではありません。実際に関数を名前で渡すのではなく、定義されていない定数andを渡すだけです。その状況での動作は通知*を出し、文字列値 "and"に戻ります。これはグローバル関数の有効な識別子なので、コードは正常に実行されます(ただし、エラー通知があります)。

fold()に直接関数を渡す唯一の方法は、あなたが言うように、それを変数に割り当てることです。それ以外の場合は、単にグローバル関数の名前を渡すだけで、うまくいく間に、おそらくあなたが達成しようとしているものではありません。

*この通知は、関数名は引用符でなければなりません

+0

私の一般的な機能は、通常、グローバルです。したがって、ほとんどの場合、おそらく安全です。 2番目の考えでは、部分的に適用された関数(例えば、 '$ sum = fold(add、0)')を割り当てると、とにかく '$'で終了します。ですから、私はこの構文に慣れるのがよいでしょう。 – ftor

関連する問題