ホームページ >バックエンド開発 >PHPチュートリアル >PHPマスター| PHPの機能プログラミング

PHPマスター| PHPの機能プログラミング

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-02-24 09:54:17371ブラウズ

PHP Master | Functional Programming in PHP

多くのプログラマーは機能的なプログラミングについて話すのが好きですが、実際にそれを使用したかどうかを尋ねると、ほとんどの答えは「いいえ」になります。その理由は簡単です。プログラミングの初心者が、命令的な方法で、つまりプログラムのフローチャートとステップを考えるように教えられています。したがって、この記事では、機能プログラミングのいくつかの重要な概念と、PHPで機能コードを書く方法について説明します。

キーポイント

  • 機能的プログラミングは、計算を数学機能の評価として扱い、状態および可変データを回避し、機能を一流の市民として扱います。これは、関数が命令プログラミングの値のように使用できることを意味します。
  • 機能的プログラミングの重要な概念には、不変性(一度定義されると、変数の値を変更できません)、再帰(不変性のために頻繁に使用)、純粋な関数(副作用のない関数)、および高次関数(関数を高次関数に変換するために使用できます)。
  • 機能的なプログラミングにより、状態データと変数データを回避することにより、安全なプログラミングを促進するためのよりシンプルで読みやすいコードが可能になります。また、管理プロセスでの偶発的なイベントではなく、達成したいことに集中するのにも役立ちます。
  • 機能的プログラミングの利点にもかかわらず、その学習曲線は、命令的に訓練された人にとっては非常に急です。機能プログラミングに関連する利点のいくつかは、従来、機能プログラミング言語として設計されていないため、PHPには適用されません。また、プログラムを作成する最も効率的な方法ではない場合があります。

機能プログラミングの重要な概念

Wikipediaは、機能プログラミングを「計算を数学的関数の評価として扱い、状態および変数データを回避するプログラミングパラダイム」と定義しています。機能プログラミングでは、機能は一流の市民と見なされますが、命令的なプログラミングでは、主にデータとデータを変更して期待される結果を達成する手順に焦点を当てます。関数が一流の市民であると言うとき、これは、命令プログラミングで値を使用するような関数を使用できることを意味します。それらは、関数へのパラメーターとして渡されたり、別の関数内で定義されたり、結果として返されることもできます。言い換えれば、「関数は値です」。これについては後でもう一度説明しますが、機能プログラミングには他にも多くの重要な概念があります。いくつかの例を挙げると:

不変

不変性とは、変数の値が定義されると変更できないという動作を指します。異なる言語には異なる実装があります。たとえば、PHPでは、可変不変を保つ唯一の方法は、それを定数として定義することです。

再帰

再帰は、機能プログラミングでも顕著です。命令的なプログラミングでは、セットまたは配列を操作する必要がある場合、各要素を繰り返して一時変数を使用して現在の値を保存するために、forおよびforeachなどのループ構造を使用できます。ただし、このアプローチは、不変性のために機能的なプログラミングでは不可能です。この簿記はコールスタックを介して暗黙的に行われるため、再帰が答えです。アレイ内のすべての要素の合計を見つけるために関数を記述する必要があるとします(今のところarray_sum()の存在を忘れてください)。機能スタイルでは、次のように書きます

<code class="language-php"><?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
?></code>
空のリストは0を返します。これは基本的な条件です。複数の値を含む配列の場合、他のすべての要素の再帰合計に最初の要素を追加した結果を返します。

純粋な関数と参照透明性

関数が独自の外部オブジェクト(グローバル変数や静的変数など)の値を変更せず、I/O効果(ファイル、データベースなどへの書き込みなど)がない場合、関数は言われます副作用がないこと。このような関数は、純粋な関数とも呼ばれます。特定のパラメーターセットの場合、純粋な関数の出力は常に同じであり、その結果、参照透明性と呼ばれる別のプロパティが生じます。関数が透過的に参照される場合、プログラムの動作に影響を与えることなく、関数をその値に置き換えることができます。すべての数学関数は純粋な関数であり、日付関数、rand()などは非純度関数です。

Advanced Order Functions

上記の概念は、ほとんどすべてのプログラミング言語で実装できますが、一流の市民機能と高次関数は、機能プログラミングの最も顕著な2つの機能です。一流の市民機能は、関数を価値として扱うことができることを意味することを説明しました。高次関数とは、関数をパラメーターとして使用し、結果として関数を返すことができる関数です。最近追加された2つの重要な機能により、PHP:Lambda Expressionsと閉鎖に高次関数を書くことができます。

lambda関数

lambda関数(匿名関数とも呼ばれます)は、名前のない関数です。匿名関数を定義すると、関数への参照が返され、後で使用するために変数に保存されます。この変数を使用して、必要に応じて関数を呼び出します。多くの異なる言語がこの概念を採用しています。実際、毎日のJavaScriptプログラミングでLambda関数を使用して、さまざまなユーザーインタラクションやAJAXコールのコールバックとして使用する場合があります。

<code class="language-javascript">$("#myButton").click(function () {
    // do something
});</code>
このコードは非常にシンプルで理解しやすいので、その機能的な側面を忘れさせるかもしれません。 PHPはバージョン5.3にこの強力な機能を導入しました。これにより、PHPコードを同様の方法で記述できます。

関数、特に匿名関数について話すとき、可変範囲に対処する方法を理解することが重要です。たとえば、JavaScriptを使用すると、PHPはそうではありませんが、Lambdas内の外部スコープ変数にアクセスできます。 Lambdaには、通常のPHP関数と同様に、内部に独自のスコープがあります。
<code class="language-php"><?php
$square = function ($arg) {
    return $arg * $arg;
};

$value = $square(2); // 4
?></code>

閉じる

時々、関数内の親スコープの変数を参照することをお勧めします。閉鎖はLambda関数に似ていますが、わずかに異なり、外部スコープで変数にアクセスできます。 PHP 5.3でも導入されたPHPの使用キーワードを使用して、「Reach Out」を使用して外部変数を結合できます。

<code class="language-php"><?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
?></code>
この場合、関数が呼び出されるたびに金利を渡すことはありません。代わりに、外部から定義し、使用キーワードを使用して関数内で使用できるようにします。

部分的な関数とカレー

簡単に言えば、一部の関数は既存の関数から作成された関数であり、そのパラメーターは部分的に適用されます。作成された関数を呼び出すときに、残りのパラメーターを渡す必要があります。閉鎖を使用して、PHPに部分的な関数を作成できます。これは、その長さ、幅、高さに基づいてボックスのボリュームを見つける例です。すべてのパラメーターはオプションです。すべてのパラメーターが提供されない場合、関数は残りの必要な値を受け入れるために別の関数を返します。

<code class="language-javascript">$("#myButton").click(function () {
    // do something
});</code>
すべてのパラメーターはオプションです。まず、発信者がすべてのパラメーターに合格したかどうかを確認します。この場合、長さ、幅、高さを掛けることで、ボリュームに直接戻すことができます。パラメーターの数がパラメーターよりも少ない場合、特定のパラメータープリセットのボリュームを見つけるために新しい関数が返されます。ここで、固定された長さのボックスのボリュームを探しているとします(例:10)。これは、最初のパラメーターとして10を取得することで簡単に実行できます。または、最初のパラメーターとして10を取得して、残りの値のみを要求することで部分関数を作成することができます。

<code class="language-php"><?php
$square = function ($arg) {
    return $arg * $arg;
};

$value = $square(2); // 4
?></code>
カリーは部分的な関数の特別なケースであり、複数のパラメーターをそれぞれそれぞれを単一のパラメーターを受け入れる複数の関数に受け入れる関数を変換します。たとえば、

f(x、y、z)f(x)(y)(z)に似ています(ただし、php構文では、このようなネストされた関数呼び出しは許可されていません)。あなたがもっと学ぶことに興味があるなら、ティモシー・ボロンチクは実際の例でカリーについての素晴らしい記事を書いています。

長所と短所

機能プログラミングの機能には、PHPで多くの実用的な用途があります。たとえば、コールバック関数を使用する場合、Lambda関数は広く使用されています。たとえば、スリムフレームワークを使用して、次のルートを定義できます。

<code class="language-php"><?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
?></code>
要求されたURLがこのルートと一致するとき、

Slimはコールバック関数を呼び出します。ヴァンスルーカスは、以前にラムダ機能の他の興味深いユースケースに関する記事をいくつか執筆しています。状態データと変数データを避けて、安全なプログラミングを奨励します。機能プログラミングでは、1つのことだけを行い、それぞれ副作用を行わない関数を記述する必要があります。このパラダイムがモジュール性と機能のシンプルさに重点を置いていると、異なる小さなサブルーチンに基づいてプログラムを簡単に推測できます。機能的なプログラミングは、プロセス内の偶発的なイベントを明示的に管理するのではなく、達成したいものに焦点を当てたコードを作成するのにも役立ちます(ループカウンター変数を管理する必要があることと再帰を比較してください)。ただし、機能的なプログラミングに伝統的に関連する利点のいくつかは、機能的なプログラミング言語として設計されていないため、PHPには適用されないことを忘れないでください。たとえば、副作用のない機能は並列処理に最適ですが、PHPスクリプトはこのように実行されません。また、再帰的および怠zyな機能のコストを計算することは必ずしも容易ではありません。また、内部のオーバーヘッドのために深刻なパフォーマンスの問題があるかもしれません。時には、効率を改善するために変動性のあるプログラムを書く方が理にかなっています。おそらく、機能プログラミングの最大の欠点は、命令的に訓練された人のために非常に急な学習曲線を持っていることです。しかし、全体として、機能的なプログラミングは楽しいものであり、それを学ぶことで、古い問題について考え、プログラマーとして成長するのに役立つ新しいツールが提供されます。これは普遍的なソリューションではありませんが、必要に応じて、よりクリーンでよりエレガントなPHPコードに適用できます。

概要

機能的なプログラミングは、単なるプログラミングのパラダイムではありません。機能的な思考を行うことができれば、ほとんどすべての言語で機能的にプログラムできます。この記事では、PHPの機能を使用してそれらの例を書いて提供する機能的プログラミングの基本について説明します。この記事で示されている例はあなたにとって実用的ではないかもしれませんが、機能的なスタイルがあなたが書いているコードの品質を大幅に改善できる多くの状況を見つけるでしょう。このようなケースを探してみて、機能的に考えて、楽しんでください! Fotoliaの写真

PHP機能プログラミングに関するよくある質問

PHPにおける機能プログラミングとオブジェクト指向プログラミングの主な違いは何ですか?

機能的プログラミングとオブジェクト指向プログラミングは、PHPで使用される2つの異なるパラダイムです。主な違いは、州とデータの管理方法です。機能プログラミングでは、機能は一流の市民であり、国家の概念はありません。これは、同じ入力が与えられた場合、関数が常に同じ出力を生成することを意味します。一方、オブジェクト指向のプログラミングは、時間の経過とともに状態と変化を維持するオブジェクトとそれらの相互作用を中心に展開します。これにより、入力が同じであっても、異なる出力が生じる可能性があります。

機能プログラミングのPHPを始めるにはどうすればよいですか?

PHPで機能的なプログラミングを開始するには、純粋な機能、不変性、高次関数などの基本概念を理解する必要があります。次に、状態を変更せず、副作用を持たない関数の書き込みを開始できます。 PHPには、array_maparray_filterarray_reduceなどの機能的なプログラミングをサポートする組み込み関数があります。また、データアレイを使用するためのスムーズで便利なラッパーを提供するLaravelコレクションなどのライブラリを使用することもできます。

PHPにおける機能プログラミングの利点は何ですか?

PHPでの機能的プログラミングを使用すると、クリーナーを作成し、コードを読みやすく書くことができます。副作用や状態の変更などの一般的なプログラミングの問題を回避するのに役立ちます。これにより、コードが予測とテストを容易にすることができます。機能を簡単に結合して再利用できるため、機能的なプログラミングはより多くのモジュラーコードも可能にします。

PHPを使用した機能的プログラミングの制限または課題は何ですか?

機能的なプログラミングには利点がありますが、いくつかの課題もあります。 PHPはもともと機能プログラミング用に設計されていなかったため、一部の機能は、機能プログラミング用に設計された言語ほど強力または効率的ではない場合があります。さらに、機能的なプログラミングにはさまざまな考え方が必要であり、学習曲線は、不可欠またはオブジェクト指向のプログラミングに慣れている開発者にとって急激になります。

PHPで機能的なプログラミングとオブジェクト指向プログラミングの組み合わせを使用できますか?

はい、PHPはマルチパラグラフ言語です。つまり、さまざまなプログラミングスタイルを組み合わせることができます。状態と行動の恩恵を受けるアプリケーションパーツにはオブジェクト指向プログラミング、およびステートレスの副作用のない機能の恩恵を受けるアプリケーションパーツの機能プログラミングを使用できます。これにより、アプリケーションのすべての部分に最適な方法を選択する柔軟性が得られます。

機能プログラミングはPHPのパフォーマンスにどのように影響しますか?

PHPパフォーマンスに対する機能プログラミングの影響は異なる場合があります。場合によっては、機能的なプログラミングは、状態の変更や副作用を回避するため、より効率的なコードを記述できます。ただし、他の場合は、通常、既存のオブジェクトを変更するのではなく、新しいオブジェクトを作成することを伴うため、非効率的な場合があります。コードを分析およびテストして、パフォーマンス要件を満たしていることを確認することが重要です。

PHP機能プログラミングを学習するための良いリソースは何ですか?

PHP機能プログラミングを学習するために利用できるリソースがたくさんあります。いくつかの優れた出発点には、PHPマニュアル(機能プログラミングに関するセクションがあります)と、オンラインチュートリアルや記事が含まれます。 Gilles CrettenandによるPHP機能プログラミングなど、このトピックに関する本もあります。

PHPのWeb開発に機能的なプログラミングを使用できますか?

はい、PHPのWeb開発に機能的なプログラミングを使用できます。機能的なプログラミングは、Web開発環境で有益なクリーナーとよりモジュラーコードの作成に役立ちます。ただし、PHPはマルチパラグラフ言語であるため、オブジェクト指向のプログラミングなどの他のプログラミングスタイルも使用できます。

PHPの機能プログラミングでのエラー処理を処理する方法は?

機能プログラミングでは、通常、モナドを使用してエラー処理が行われます。これは、値ではなく計算を表すことができるデータ構造です。 PHPでは、エラー処理のためにおそらくモナドを使用できます。これにより、操作をリンクでき、操作が失敗した場合、チェーンの残りの部分がスキップされます。

PHPの機能プログラミングは大規模なアプリケーションに適していますか?

機能プログラミングは大規模なアプリケーションに使用できますが、アプリケーションの特定の要件に依存します。機能的なプログラミングは、大規模な環境で有益なクリーナーで、よりモジュラーコードを書き込むことができます。ただし、場合によっては非効率的である可能性があるため、トレードオフを検討することが重要です。

以上がPHPマスター| PHPの機能プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。