PHPにおける高次関数の詳細な理解:コードの柔軟性と再利用性の向上
高度な関数は、多くの大規模なアプリケーションとフレームワークで広く使用されています。 JavaScript、Java、.Net、Python、さらにはPHPさえすべて高次関数の概念をサポートしています。しかし、高次関数とは何ですか?なぜそれを使用するのですか?その利点は何ですか?コードを単純化する方法は?この記事では、PHPの高次関数に焦点を当て、他の言語と比較します。
callable
callable
PHPには、array_map
array_filter
カスタムPHP高次関数を作成するには、1つ以上の関数をパラメーターとして受け入れる関数を定義するか、結果として関数を返す、または両方の特性を持つ必要があります。たとえば、calc()
高次関数は、冗長性ボイラープレートコードの削減など、多くの利点を提供できます。ただし、機能プログラミングの概念に精通していない開発者にとっては、コードを理解してデバッグするのを難しくすることがあります。 高度な関数には2つの主要な特性があります。高度な関数は、次の特性の1つまたは2つを実装できます。1つ以上の関数を入力として受け入れるか、出力として関数を返します。 PHPには、関数が高次関数であることを明確に示すキーワードがあります:キーワードcallable
。このキーワードは必ずしも存在するわけではありませんが、高次関数を簡単に認識できます。パラメーターを備えた関数またはメソッドが表示された場合、それは入力として関数を受け入れることを意味します。もう1つの単純なフラグは、関数を使用して関数を使用して関数を使用して関数を表示する場合です。 callable
ステートメントは、関数の名前にすぎない場合もあれば、匿名/インライン関数である場合もあります。各タイプの例をいくつか紹介します。 return
return
// 我们将传递给高阶函数的简单用户定义函数 function echoHelloWorld() { echo "Hello World!"; } // 接受函数作为输入并调用它的高阶函数 function higherOrderFunction(callable $func) { $func(); } // 调用我们的高阶函数并传入我们的echoHelloWorld()函数。 // 请注意,我们只将名称作为字符串传递,没有括号。 // 这将输出 "Hello World!" higherOrderFunction('echoHelloWorld');
関数を渡して、それを使用して別の返された関数を生成できると想像できます。とても賢いトリックですよね?しかし、なぜあなたはこれをするのですか?物事をより複雑にするもののように聞こえます。
// 返回PHP中名为trim()的现有函数。注意它是一个简单的字符串,没有括号。 function trimMessage1() { return 'trim'; } // 这是一个使用匿名内联函数的示例 function trimMessage2() { return function($text) { return trim($text); }; } // 返回'trim'函数 $trim1 = trimMessage1(); // 使用我们的字符串进行修剪并调用它 echo $trim1(' hello world '); // 返回内部调用'trim'的匿名函数 $trim2 = trimMessage1(); // 使用我们的字符串进行修剪并再次调用它 echo $trim2(' hello world ');
コードに高次関数を作成する必要があるかもしれない多くの理由があります。コードの柔軟性、コードの再利用、コード拡張、他のプログラムで表示されるコードを模倣するコードソリューションへのコード拡張機能から、多くのことがあります。多くの理由がありますが、ここでそれらのいくつかを紹介します。
高次関数は、多くの柔軟性を追加します。前の例に基づいて、いくつかの用途を見たことがあるかもしれません。異なる関数のセット全体を撮影し、コードを作成して個別に実行することなく使用する単一の関数を記述できます。
関数である可能性があり、次の瞬間は
関数である可能性があります。どちらの場合でも、正常に動作します。
add()
コードを簡単に拡張できますdivide()
関数を追加する必要があります。 add()
関数を書き込み、それらを変更せずに高次関数に渡すことができます。後で例では、この関数を使用して独自のdivide()
関数を作成する方法を示します。 sum()
sum()
他の言語の関数を模倣しますcalc()
PHPで高次関数を見つけるための検索は非常に簡単です。 PHPドキュメントを確認し、callable
入力パラメーターを受け入れる関数/メソッドを見つけてください。一般的に使用される高次関数の例をいくつか紹介します。あなたはあなたの知識なしにそれらを使用したことさえあります。
array_map
およびarray_filter
// 我们将传递给高阶函数的简单用户定义函数 function echoHelloWorld() { echo "Hello World!"; } // 接受函数作为输入并调用它的高阶函数 function higherOrderFunction(callable $func) { $func(); } // 调用我们的高阶函数并传入我们的echoHelloWorld()函数。 // 请注意,我们只将名称作为字符串传递,没有括号。 // 这将输出 "Hello World!" higherOrderFunction('echoHelloWorld');
別の関数の使用方法を見てみましょう。今回は個別に定義したフィルター関数を使用してください。
// 返回PHP中名为trim()的现有函数。注意它是一个简单的字符串,没有括号。 function trimMessage1() { return 'trim'; } // 这是一个使用匿名内联函数的示例 function trimMessage2() { return function($text) { return trim($text); }; } // 返回'trim'函数 $trim1 = trimMessage1(); // 使用我们的字符串进行修剪并调用它 echo $trim1(' hello world '); // 返回内部调用'trim'的匿名函数 $trim2 = trimMessage1(); // 使用我们的字符串进行修剪并再次调用它 echo $trim2(' hello world ');
およびarray_filter
は、多くのコードプロジェクトに見られる2つの非常に人気のある高次関数です。使用する可能性のあるもう1つの関数は、array_map
です。これは、関数とパラメーターのリストを取得し、その関数を呼び出します。これは基本的にカスタムの高次関数です。その完全な目的は、他のユーザー定義の関数を呼び出すことです:call_user_func
$arrayOfNums = [1,2,3,4,5]; // array_map:使用内联匿名函数的示例 $doubledNums = array_map(function($num) { return $num * 2; }, $arrayOfNums); var_dump($doubledNums); // 输出包含 [2, 4, 6, 8, 10] 的数组
と呼ばれる新しい関数を使用して、その柔軟性をさらに実証しましょう。この関数は、2つのパラメーターと関数を受け取ります。これらのパラメーターで動作して結果が得られます。
calc()
$arrayOfNums = [1,2,3,4,5]; // 创建函数并将其提供给高阶函数array_filter()的示例 function isEven($num) { return ($num % 2) === 0; } // array_filter是一个高阶函数 $evenNums = array_filter($arrayOfNums, 'isEven'); var_dump($evenNums); // 输出包含 [2, 4] 的数组
およびcalc()
で呼び出すことができます。この場合、計算された関数は、受信する関数が何をするかを気にしません。引数を関数に渡すだけで、結果を返します。 $n1
<しかし、連結文字列はあなたの典型的な数学操作ではありません。ただし、ここの設定を使用すると、文字列の連結を追加して、$n2
:
calc()
この例は大げさですが、この概念を大規模なプロジェクトで使用する方法を示しています。おそらく、高次関数は、イベントの処理方法を決定します。おそらく、トリガーされたイベントに応じて、渡されたハンドラー関数を通してそれをルーティングできます。可能性は無限です。
function printCustomMessage($message) { echo "$message"; } call_user_func('printCustomMessage', '通过使用call_user_func调用自定义消息!');
Pythonのシンプルなデコレーターを例として取り、JavaScriptと比較してから、PHPと比較しましょう。そうすれば、PythonまたはJSを知っていれば、それが同等であることがわかります。
ここで、これをJavaScriptの高次関数に実装する方法を見てみましょう:
function add($a, $b) { return $a + $b; } function subtract($a, $b) { return $a - $b; } function multiply($a, $b) { return $a * $b; } // 传递$n1和$n2的高阶函数 function calc($n1, $n2, $math_func) { return $math_func($n1, $n2); } $addedNums = calc(1, 5, 'add'); $subtractedNums = calc(1, 5, 'subtract'); $multipliedNums = calc(1, 5, 'multiply'); // 输出 6 echo "相加的数字:$addedNums\n"; // 输出 -4 echo "相减的数字:$subtractedNums\n"; // 输出 5 echo "相乘的数字:$multipliedNums\n";
と比較しましょう
function addTwoStrings($a, $b) { return $a . " " . $b; } // 输出 "Hello World!" $concatenatedStrings = calc('Hello', 'World!', 'addTwoStrings');
高次関数を使用する場合、インライン匿名関数(ラムダとも呼ばれる)の使用がよくわかります。上記の例では、この形式を使用しました。それとは別に、最初に関数を定義してから、より明示的なバージョンのより明示的なバージョンを使用し、それを高次関数に渡しました。これは、両方のバージョンを見ることに慣れるためです。ほとんどの場合、高次関数を使用するフレームワークにインラインラムダバージョンが表示されます。この形式に怖がらせないでください。名前のない単純な関数を作成するだけで、独立した関数名を提供する場所に使用します。
次に、
やarray_map
などのPHPの既存の高次関数の例をいくつか示し、次に、いくつかの入力関数といくつかの入力関数を受け入れる独自の高次関数を作成します。いくつかのパラメーターで動作します。次に、PHPのソリューションがPythonデコレーターとJavaScriptの実装と比較される方法を示すために、並んで比較しました。高次関数について、そして次の大規模なソリューションでそれらを考慮する必要がある理由についてもっと学ぶことができることを願っています。多くの利点を提供し、冗長性のあるボイラープレートコードを削減できます。 array_filter
calc()
PHPでの機能プログラミングの詳細については、チュートリアルを参照できます。
お読みいただきありがとうございます!
PHPの高度な注文関数のFAQPHPの高次関数の重要性は何ですか?
PHPの高次関数の例を提供できますか?
// 我们将传递给高阶函数的简单用户定义函数 function echoHelloWorld() { echo "Hello World!"; } // 接受函数作为输入并调用它的高阶函数 function higherOrderFunction(callable $func) { $func(); } // 调用我们的高阶函数并传入我们的echoHelloWorld()函数。 // 请注意,我们只将名称作为字符串传递,没有括号。 // 这将输出 "Hello World!" higherOrderFunction('echoHelloWorld');
PHPで高次関数を使用することの欠点はありますか?
PHPで独自の高次関数を作成する方法は?
PHPの高次関数は複数の関数を返すことができますか?
// 返回PHP中名为trim()的现有函数。注意它是一个简单的字符串,没有括号。 function trimMessage1() { return 'trim'; } // 这是一个使用匿名内联函数的示例 function trimMessage2() { return function($text) { return trim($text); }; } // 返回'trim'函数 $trim1 = trimMessage1(); // 使用我们的字符串进行修剪并调用它 echo $trim1(' hello world '); // 返回内部调用'trim'的匿名函数 $trim2 = trimMessage1(); // 使用我们的字符串进行修剪并再次调用它 echo $trim2(' hello world ');
PHPの高次関数は、異なるスコープから関数を受け入れることができますか?
PHPの高次関数と閉鎖の関係は何ですか?
PHPの閉鎖は、周囲のスコープで変数をキャプチャする匿名関数です。それらは、パラメーターよりも多くのデータにアクセスする関数を作成できるため、高次関数でよく使用されます。これは、より柔軟で再利用可能なコードを作成するのに非常に役立ちます。はい、PHPはいくつかの組み込みの高次関数を提供します。いくつかの例には、
が含まれます。これらの関数は、コールバック関数を引数として取得し、さまざまな方法で配列の要素に適用します。 array_map
以上がPHPにおける機能プログラミング:高次関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。