多くのプログラマーは機能的なプログラミングについて話すのが好きですが、実際にそれを使用したかどうかを尋ねると、ほとんどの答えは「いいえ」になります。その理由は簡単です。プログラミングの初心者が、命令的な方法で、つまりプログラムのフローチャートとステップを考えるように教えられています。したがって、この記事では、機能プログラミングのいくつかの重要な概念と、PHPで機能コードを書く方法について説明します。
キーポイント
機能プログラミングの重要な概念
Wikipediaは、機能プログラミングを「計算を数学的関数の評価として扱い、状態および変数データを回避するプログラミングパラダイム」と定義しています。機能プログラミングでは、機能は一流の市民と見なされますが、命令的なプログラミングでは、主にデータとデータを変更して期待される結果を達成する手順に焦点を当てます。関数が一流の市民であると言うとき、これは、命令プログラミングで値を使用するような関数を使用できることを意味します。それらは、関数へのパラメーターとして渡されたり、別の関数内で定義されたり、結果として返されることもできます。言い換えれば、「関数は値です」。これについては後でもう一度説明しますが、機能プログラミングには他にも多くの重要な概念があります。いくつかの例を挙げると:不変
再帰は、機能プログラミングでも顕著です。命令的なプログラミングでは、セットまたは配列を操作する必要がある場合、各要素を繰り返して一時変数を使用して現在の値を保存するために、forおよびforeachなどのループ構造を使用できます。ただし、このアプローチは、不変性のために機能的なプログラミングでは不可能です。この簿記はコールスタックを介して暗黙的に行われるため、再帰が答えです。アレイ内のすべての要素の合計を見つけるために関数を記述する必要があるとします(今のところarray_sum()の存在を忘れてください)。機能スタイルでは、次のように書きます
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
純粋な関数と参照透明性
Advanced Order Functions
lambda関数
$("#myButton").click(function () { // do something });
関数、特に匿名関数について話すとき、可変範囲に対処する方法を理解することが重要です。たとえば、JavaScriptを使用すると、PHPはそうではありませんが、Lambdas内の外部スコープ変数にアクセスできます。 Lambdaには、通常のPHP関数と同様に、内部に独自のスコープがあります。
<?php $square = function ($arg) { return $arg * $arg; }; $value = $square(2); // 4 ?>
時々、関数内の親スコープの変数を参照することをお勧めします。閉鎖はLambda関数に似ていますが、わずかに異なり、外部スコープで変数にアクセスできます。 PHP 5.3でも導入されたPHPの使用キーワードを使用して、「Reach Out」を使用して外部変数を結合できます。
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
部分的な関数とカレー
$("#myButton").click(function () { // do something });
<?php $square = function ($arg) { return $arg * $arg; }; $value = $square(2); // 4 ?>
f(x、y、z)f(x)(y)(z)に似ています(ただし、php構文では、このようなネストされた関数呼び出しは許可されていません)。あなたがもっと学ぶことに興味があるなら、ティモシー・ボロンチクは実際の例でカリーについての素晴らしい記事を書いています。
長所と短所機能プログラミングの機能には、PHPで多くの実用的な用途があります。たとえば、コールバック関数を使用する場合、Lambda関数は広く使用されています。たとえば、スリムフレームワークを使用して、次のルートを定義できます。
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
Slimはコールバック関数を呼び出します。ヴァンスルーカスは、以前にラムダ機能の他の興味深いユースケースに関する記事をいくつか執筆しています。状態データと変数データを避けて、安全なプログラミングを奨励します。機能プログラミングでは、1つのことだけを行い、それぞれ副作用を行わない関数を記述する必要があります。このパラダイムがモジュール性と機能のシンプルさに重点を置いていると、異なる小さなサブルーチンに基づいてプログラムを簡単に推測できます。機能的なプログラミングは、プロセス内の偶発的なイベントを明示的に管理するのではなく、達成したいものに焦点を当てたコードを作成するのにも役立ちます(ループカウンター変数を管理する必要があることと再帰を比較してください)。ただし、機能的なプログラミングに伝統的に関連する利点のいくつかは、機能的なプログラミング言語として設計されていないため、PHPには適用されないことを忘れないでください。たとえば、副作用のない機能は並列処理に最適ですが、PHPスクリプトはこのように実行されません。また、再帰的および怠zyな機能のコストを計算することは必ずしも容易ではありません。また、内部のオーバーヘッドのために深刻なパフォーマンスの問題があるかもしれません。時には、効率を改善するために変動性のあるプログラムを書く方が理にかなっています。おそらく、機能プログラミングの最大の欠点は、命令的に訓練された人のために非常に急な学習曲線を持っていることです。しかし、全体として、機能的なプログラミングは楽しいものであり、それを学ぶことで、古い問題について考え、プログラマーとして成長するのに役立つ新しいツールが提供されます。これは普遍的なソリューションではありませんが、必要に応じて、よりクリーンでよりエレガントなPHPコードに適用できます。
概要
機能的なプログラミングは、単なるプログラミングのパラダイムではありません。機能的な思考を行うことができれば、ほとんどすべての言語で機能的にプログラムできます。この記事では、PHPの機能を使用してそれらの例を書いて提供する機能的プログラミングの基本について説明します。この記事で示されている例はあなたにとって実用的ではないかもしれませんが、機能的なスタイルがあなたが書いているコードの品質を大幅に改善できる多くの状況を見つけるでしょう。このようなケースを探してみて、機能的に考えて、楽しんでください! Fotoliaの写真
PHP機能プログラミングに関するよくある質問PHPにおける機能プログラミングとオブジェクト指向プログラミングの主な違いは何ですか?
PHPで機能的なプログラミングを開始するには、純粋な機能、不変性、高次関数などの基本概念を理解する必要があります。次に、状態を変更せず、副作用を持たない関数の書き込みを開始できます。 PHPには、array_map
、array_filter
、array_reduce
などの機能的なプログラミングをサポートする組み込み関数があります。また、データアレイを使用するためのスムーズで便利なラッパーを提供するLaravelコレクションなどのライブラリを使用することもできます。
PHPを使用した機能的プログラミングの制限または課題は何ですか?
PHPで機能的なプログラミングとオブジェクト指向プログラミングの組み合わせを使用できますか?
機能プログラミングはPHPのパフォーマンスにどのように影響しますか?
PHP機能プログラミングを学習するための良いリソースは何ですか?
PHPのWeb開発に機能的なプログラミングを使用できますか?
機能プログラミングでは、通常、モナドを使用してエラー処理が行われます。これは、値ではなく計算を表すことができるデータ構造です。 PHPでは、エラー処理のためにおそらくモナドを使用できます。これにより、操作をリンクでき、操作が失敗した場合、チェーンの残りの部分がスキップされます。
機能プログラミングは大規模なアプリケーションに使用できますが、アプリケーションの特定の要件に依存します。機能的なプログラミングは、大規模な環境で有益なクリーナーで、よりモジュラーコードを書き込むことができます。ただし、場合によっては非効率的である可能性があるため、トレードオフを検討することが重要です。
以上がPHPマスター| PHPの機能プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。