PHPにおける機能プログラミング:高次関数
PHPにおける高次関数の詳細な理解:コードの柔軟性と再利用性の向上
高度な関数は、多くの大規模なアプリケーションとフレームワークで広く使用されています。 JavaScript、Java、.Net、Python、さらにはPHPさえすべて高次関数の概念をサポートしています。しかし、高次関数とは何ですか?なぜそれを使用するのですか?その利点は何ですか?コードを単純化する方法は?この記事では、PHPの高次関数に焦点を当て、他の言語と比較します。
コアポイント
- PHPの高次関数とは、入力として1つ以上の関数を受け入れるか、出力として関数を返すことができる関数を指します。この機能は、簡単な拡張機能とコードの再利用のためにコードの柔軟性を高めます。 PHPでは、キーワードを使用して、高次関数を識別することができます。関数またはメソッドに
- パラメーターがある場合、それは入力として関数を受け入れることを意味します。
callable
callable
PHPには、 や - などの組み込みの高次関数が含まれています。これらの関数は、コールバック関数を引数として取得し、異なる方法で配列の要素に適用します。
array_map
array_filter
カスタムPHP高次関数を作成するには、1つ以上の関数をパラメーターとして受け入れる関数を定義するか、結果として関数を返す、または両方の特性を持つ必要があります。たとえば、 という関数はいくつかの入力関数を取り、いくつかのパラメーターで動作します。 -
calc()
高次関数は、冗長性ボイラープレートコードの削減など、多くの利点を提供できます。ただし、機能プログラミングの概念に精通していない開発者にとっては、コードを理解してデバッグするのを難しくすることがあります。 - ファーストクラス関数
高次関数を理解する前に、最初に一流の関数(一次関数とも呼ばれる)をサポートする言語特性を理解する必要があります。これは、言語がこの機能を一流の市民として扱うことを意味します。言い換えれば、言語は変数と同じように機能します。変数に関数を保存し、変数として他の関数に渡し、変数などの関数からそれらを返すことができ、変数のような配列またはオブジェクトプロパティに保存することもできます。今日、ほとんどの最新の言語にはデフォルトでこの機能があります。関数は変数のように渡され、使用できることを知る必要があります。
この記事では、主にパラメーターとして関数を渡すことに焦点を当て、結果として関数を返すことに焦点を当て、非ローカル変数と閉鎖の概念を簡単に紹介します。 (これらの概念の詳細については、前の段落でリンクされているウィキペディアの記事のセクション1.1、1.4、および1.3を読むことができます。)高次関数とは何ですか?
高度な関数には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で高次関数を見つけるための検索は非常に簡単です。 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] 的数组
PHPで高次関数がどのように機能するかについての多くの例を示しており、さまざまな用途を実証するためにいくつかのカスタム関数を作成しました。しかし、さらに
と呼ばれる新しい関数を使用して、その柔軟性をさらに実証しましょう。この関数は、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を知っていれば、それが同等であることがわかります。
PythonおよびJavaScriptとの並んで並んで並んでいます
ここで、これを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');
lambda/匿名関数の短い説明
高次関数を使用する場合、インライン匿名関数(ラムダとも呼ばれる)の使用がよくわかります。上記の例では、この形式を使用しました。それとは別に、最初に関数を定義してから、より明示的なバージョンのより明示的なバージョンを使用し、それを高次関数に渡しました。これは、両方のバージョンを見ることに慣れるためです。ほとんどの場合、高次関数を使用するフレームワークにインラインラムダバージョンが表示されます。この形式に怖がらせないでください。名前のない単純な関数を作成するだけで、独立した関数名を提供する場所に使用します。
結論
この記事では、関数を高次関数にするという基本的な定義を紹介します。関数(またはその両方)を受け入れるか返す関数は、より高次関数と見なすことができます。また、これらのタイプの機能とその利点を作成したい理由についても説明します。次に、
やarray_map
などのPHPの既存の高次関数の例をいくつか示し、次に、いくつかの入力関数といくつかの入力関数を受け入れる独自の高次関数を作成します。いくつかのパラメーターで動作します。次に、PHPのソリューションがPythonデコレーターとJavaScriptの実装と比較される方法を示すために、並んで比較しました。高次関数について、そして次の大規模なソリューションでそれらを考慮する必要がある理由についてもっと学ぶことができることを願っています。多くの利点を提供し、冗長性のあるボイラープレートコードを削減できます。 array_filter
calc()
PHPでの機能プログラミングの詳細については、チュートリアルを参照できます。
お読みいただきありがとうございます!
PHPの高度な注文関数のFAQPHPの高次関数の重要性は何ですか?
PHPの高次関数は、機能プログラミングの基本概念です。それらは、それらを議論として取得したり、結果としてそれらを返すことにより、他の機能で動作できる機能です。これにより、より抽象的で簡潔なコードが可能になり、読みやすさと保守性が向上します。高度な注文機能は、コードの重複と複雑さを減らすのに役立ち、コードをより効率的かつデバッグしやすくします。
PHPの高次関数と通常の機能の違いは何ですか?
PHPの通常の関数は、特定のタスクを実行し、結果を返します。一方、高次関数は、1つ以上の関数をパラメーターとして使用したり、結果として関数を返すか、これら2つの特性を同時に持つことができます。これにより、コードの柔軟性と抽象化が高まり、コードが少ないため、より複雑な関数を作成できます。PHPの高次関数の例を提供できますか?
もちろん、PHPの
関数を考えてみましょう。これは高次関数です。コールバック関数と配列をパラメーターとして使用し、アレイの各要素にコールバック関数を適用し、結果を含む新しい配列を返します。// 我们将传递给高阶函数的简单用户定义函数 function echoHelloWorld() { echo "Hello World!"; } // 接受函数作为输入并调用它的高阶函数 function higherOrderFunction(callable $func) { $func(); } // 调用我们的高阶函数并传入我们的echoHelloWorld()函数。 // 请注意,我们只将名称作为字符串传递,没有括号。 // 这将输出 "Hello World!" higherOrderFunction('echoHelloWorld');
PHPで高次関数を使用することの利点は何ですか?
PHPの高次関数は、複数の利点を提供します。これらは、より抽象的で簡潔なコードを可能にし、読みやすさと保守性を向上させることができます。また、コードの複製と複雑さを軽減し、コードをより効率的でデバッグしやすくすることもできます。さらに、さまざまな動作を達成するために異なる関数を高次関数に渡すことができるため、高次関数はコードの再利用を促進できます。PHPで高次関数を使用することの欠点はありますか?
高次関数は多くの利点を提供しますが、いくつかの欠点もある場合があります。特に機能的なプログラミングの概念に精通していない開発者にとって、彼らは時々コードを理解してデバッグするのを難しくします。さらに、高次関数を使用すると、他の関数の作成と呼び出しが必要なため、パフォーマンスのオーバーヘッドにつながる場合があります。
PHPで独自の高次関数を作成する方法は?
PHPで独自の高次関数を作成するには、1つ以上の関数をパラメーターとして受け入れることができる関数を定義するか、結果として関数を返す、または両方の特性を持つ必要があります。以下は、関数を引数として取得し、値に適用する単純な高次関数の簡単な例です。
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がファーストクラスの関数をサポートしているためです。つまり、関数は他の関数にパラメーターとして渡され、他の関数によって返され、変数に割り当てられるためです。
PHPの高次関数と閉鎖の関係は何ですか?
PHPの閉鎖は、周囲のスコープで変数をキャプチャする匿名関数です。それらは、パラメーターよりも多くのデータにアクセスする関数を作成できるため、高次関数でよく使用されます。これは、より柔軟で再利用可能なコードを作成するのに非常に役立ちます。PHPに組み込みの高次関数はありますか?
はい、PHPはいくつかの組み込みの高次関数を提供します。いくつかの例には、
、
、が含まれます。これらの関数は、コールバック関数を引数として取得し、さまざまな方法で配列の要素に適用します。 array_map
以上がPHPにおける機能プログラミング:高次関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。
