ホームページ >バックエンド開発 >PHPチュートリアル >PHPにおける機能プログラミング:高次関数

PHPにおける機能プログラミング:高次関数

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-08 11:10:12646ブラウズ

Functional Programming in PHP: Higher-order Functions

PHPにおける高次関数の詳細な理解:コードの柔軟性と再利用性の向上

高度な関数は、多くの大規模なアプリケーションとフレームワークで広く使用されています。 JavaScript、Java、.Net、Python、さらにはPHPさえすべて高次関数の概念をサポートしています。しかし、高次関数とは何ですか?なぜそれを使用するのですか?その利点は何ですか?コードを単純化する方法は?この記事では、PHPの高次関数に焦点を当て、他の言語と比較します。

コアポイント

  • PHPの高次関数とは、入力として1つ以上の関数を受け入れるか、出力として関数を返すことができる関数を指します。この機能は、簡単な拡張機能とコードの再利用のためにコードの柔軟性を高めます。
  • PHPでは、キーワードを使用して、高次関数を識別することができます。関数またはメソッドに
  • パラメーターがある場合、それは入力として関数を受け入れることを意味します。 callable callablePHPには、
  • などの組み込みの高次関数が含まれています。これらの関数は、コールバック関数を引数として取得し、異なる方法で配列の要素に適用します。 array_map array_filterカスタムPHP高次関数を作成するには、1つ以上の関数をパラメーターとして受け入れる関数を定義するか、結果として関数を返す、または両方の特性を持つ必要があります。たとえば、
  • という関数はいくつかの入力関数を取り、いくつかのパラメーターで動作します。
  • calc()高次関数は、冗長性ボイラープレートコードの削減など、多くの利点を提供できます。ただし、機能プログラミングの概念に精通していない開発者にとっては、コードを理解してデバッグするのを難しくすることがあります。
  • ファーストクラス関数

高次関数を理解する前に、最初に一流の関数(一次関数とも呼ばれる)をサポートする言語特性を理解する必要があります。これは、言語がこの機能を一流の市民として扱うことを意味します。言い換えれば、言語は変数と同じように機能します。変数に関数を保存し、変数として他の関数に渡し、変数などの関数からそれらを返すことができ、変数のような配列またはオブジェクトプロパティに保存することもできます。今日、ほとんどの最新の言語にはデフォルトでこの機能があります。関数は変数のように渡され、使用できることを知る必要があります。

この記事では、主にパラメーターとして関数を渡すことに焦点を当て、結果として関数を返すことに焦点を当て、非ローカル変数と閉鎖の概念を簡単に紹介します。 (これらの概念の詳細については、前の段落でリンクされているウィキペディアの記事のセクション1.1、1.4、および1.3を読むことができます。)

高次関数とは何ですか?

高度な関数には2つの主要な特性があります。高度な関数は、次の特性の1つまたは2つを実装できます。1つ以上の関数を入力として受け入れるか、出力として関数を返します。 PHPには、関数が高次関数であることを明確に示すキーワードがあります:キーワードcallable。このキーワードは必ずしも存在するわけではありませんが、高次関数を簡単に認識できます。パラメーターを備えた関数またはメソッドが表示された場合、それは入力として関数を受け入れることを意味します。もう1つの単純なフラグは、関数を使用して関数を使用して関数を使用して関数を表示する場合です。 callableステートメントは、関数の名前にすぎない場合もあれば、匿名/インライン関数である場合もあります。各タイプの例をいくつか紹介します。 return return

以下は、関数を返す高次関数のいくつかの簡単な例です。
<code class="language-php">// 我们将传递给高阶函数的简单用户定义函数
function echoHelloWorld() {
  echo "Hello World!";
}

// 接受函数作为输入并调用它的高阶函数
function higherOrderFunction(callable $func) {
  $func();
}

// 调用我们的高阶函数并传入我们的echoHelloWorld()函数。
// 请注意,我们只将名称作为字符串传递,没有括号。
// 这将输出 "Hello World!"
higherOrderFunction('echoHelloWorld'); </code>

関数を渡して、それを使用して別の返された関数を生成できると想像できます。とても賢いトリックですよね?しかし、なぜあなたはこれをするのですか?物事をより複雑にするもののように聞こえます。

<code class="language-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  ');</code>
なぜ高次関数を使用または作成するのですか?

コードに高次関数を作成する必要があるかもしれない多くの理由があります。コードの柔軟性、コードの再利用、コード拡張、他のプログラムで表示されるコードを模倣するコードソリューションへのコード拡張機能から、多くのことがあります。多くの理由がありますが、ここでそれらのいくつかを紹介します。

コードの柔軟性を追加

高次関数は、多くの柔軟性を追加します。前の例に基づいて、いくつかの用途を見たことがあるかもしれません。異なる関数のセット全体を撮影し、コードを作成して個別に実行することなく使用する単一の関数を記述できます。

たぶん、高次関数自体は、どのような種類の関数が受信されるかを知らないかもしれません。関数が受信する関数に関する情報を知っている必要があると誰が言いますか?入力関数はしばらくの間

関数である可能性があり、次の瞬間は

関数である可能性があります。どちらの場合でも、正常に動作します。

add()コードを簡単に拡張できますdivide()

この機能により、後で他の入力関数を簡単に追加できます。

があると仮定しますが、後で

関数を追加する必要があります。 add()関数を書き込み、それらを変更せずに高次関数に渡すことができます。後で例では、この関数を使用して独自のdivide()関数を作成する方法を示します。 sum() sum()他の言語の関数を模倣しますcalc()

PHPで高次関数を使用したいと思うもう1つの理由は、Pythonでのデコレータの動作をシミュレートすることです。ある関数は別の関数に「格闘」して、その関数の動作を変更します。たとえば、他の関数を時間に時間に書くことができます。関数を取得し、タイマーを起動し、それを呼び出してから、タイマーを終了して時間が経過した時間を確認する高次関数を書き込むことができます。

php

の既存の高次関数の例

PHPで高次関数を見つけるための検索は非常に簡単です。 PHPドキュメントを確認し、callable入力パラメーターを受け入れる関数/メソッドを見つけてください。一般的に使用される高次関数の例をいくつか紹介します。あなたはあなたの知識なしにそれらを使用したことさえあります。

高度な動的な組み合わせ:array_mapおよびarray_filter

<code class="language-php">// 我们将传递给高阶函数的简单用户定义函数
function echoHelloWorld() {
  echo "Hello World!";
}

// 接受函数作为输入并调用它的高阶函数
function higherOrderFunction(callable $func) {
  $func();
}

// 调用我们的高阶函数并传入我们的echoHelloWorld()函数。
// 请注意,我们只将名称作为字符串传递,没有括号。
// 这将输出 "Hello World!"
higherOrderFunction('echoHelloWorld'); </code>

別の関数の使用方法を見てみましょう。今回は個別に定義したフィルター関数を使用してください。

<code class="language-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  ');</code>

およびarray_filterは、多くのコードプロジェクトに見られる2つの非常に人気のある高次関数です。使用する可能性のあるもう1つの関数は、array_mapです。これは、関数とパラメーターのリストを取得し、その関数を呼び出します。これは基本的にカスタムの高次関数です。その完全な目的は、他のユーザー定義の関数を呼び出すことです:call_user_func

<code class="language-php">$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] 的数组</code>
独自の高次関数を作成する方法

PHPで高次関数がどのように機能するかについての多くの例を示しており、さまざまな用途を実証するためにいくつかのカスタム関数を作成しました。しかし、さらに

と呼ばれる新しい関数を使用して、その柔軟性をさらに実証しましょう。この関数は、2つのパラメーターと関数を受け取ります。これらのパラメーターで動作して結果が得られます。 calc()

<code class="language-php">$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] 的数组</code>
関数は非常に一般的な方法で記述されているため、他の関数のセットを受信し、パラメーター

およびcalc()で呼び出すことができます。この場合、計算された関数は、受信する関数が何をするかを気にしません。引数を関数に渡すだけで、結果を返します。 $n1 $n2:

を通過するだけです。

calc()この例は大げさですが、この概念を大規模なプロジェクトで使用する方法を示しています。おそらく、高次関数は、イベントの処理方法を決定します。おそらく、トリガーされたイベントに応じて、渡されたハンドラー関数を通してそれをルーティングできます。可能性は無限です。

<code class="language-php">function printCustomMessage($message) {
  echo "$message";
}

call_user_func('printCustomMessage', '通过使用call_user_func调用自定义消息!');</code>
高次関数を持つ他の言語との比較

Pythonのシンプルなデコレーターを例として取り、JavaScriptと比較してから、PHPと比較しましょう。そうすれば、PythonまたはJSを知っていれば、それが同等であることがわかります。

PythonおよびJavaScriptとの並んで並んで並んでいます

ここで、これをJavaScriptの高次関数に実装する方法を見てみましょう:

<code class="language-php">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";</code>
最後に、それをPHP:

と比較しましょう

<code class="language-php">function addTwoStrings($a, $b) {
  return $a . " " . $b;
}

// 输出 "Hello World!"
$concatenatedStrings = calc('Hello', 'World!', 'addTwoStrings');</code>
並べ替えの比較から、PHPバージョンはJavaScriptの構文と非常に似ていることがわかります。ただし、Pythonとデコレーターについて少し知っている場合は、デコレーターを他の2つのプログラミング言語のいずれかに変換する方法を確認できます。

lambda/匿名関数の短い説明

高次関数を使用する場合、インライン匿名関数(ラムダとも呼ばれる)の使用がよくわかります。上記の例では、この形式を使用しました。それとは別に、最初に関数を定義してから、より明示的なバージョンのより明示的なバージョンを使用し、それを高次関数に渡しました。これは、両方のバージョンを見ることに慣れるためです。ほとんどの場合、高次関数を使用するフレームワークにインラインラムダバージョンが表示されます。この形式に怖がらせないでください。名前のない単純な関数を作成するだけで、独立した関数名を提供する場所に使用します。

結論

この記事では、関数を高次関数にするという基本的な定義を紹介します。関数(またはその両方)を受け入れるか返す関数は、より高次関数と見なすことができます。また、これらのタイプの機能とその利点を作成したい理由についても説明します。

次に、

array_mapなどのPHPの既存の高次関数の例をいくつか示し、次に、いくつかの入力関数といくつかの入力関数を受け入れる独自の高次関数を作成します。いくつかのパラメーターで動作します。次に、PHPのソリューションがPythonデコレーターとJavaScriptの実装と比較される方法を示すために、並んで比較しました。高次関数について、そして次の大規模なソリューションでそれらを考慮する必要がある理由についてもっと学ぶことができることを願っています。多くの利点を提供し、冗長性のあるボイラープレートコードを削減できます。 array_filter calc() PHPでの機能プログラミングの詳細については、チュートリアルを参照できます。

お読みいただきありがとうございます!

PHPの高度な注文関数のFAQ

PHPの高次関数の重要性は何ですか?

PHPの高次関数は、機能プログラミングの基本概念です。それらは、それらを議論として取得したり、結果としてそれらを返すことにより、他の機能で動作できる機能です。これにより、より抽象的で簡潔なコードが可能になり、読みやすさと保守性が向上します。高度な注文機能は、コードの重複と複雑さを減らすのに役立ち、コードをより効率的かつデバッグしやすくします。

PHPの高次関数と通常の機能の違いは何ですか?

PHPの通常の関数は、特定のタスクを実行し、結果を返します。一方、高次関数は、1つ以上の関数をパラメーターとして使用したり、結果として関数を返すか、これら2つの特性を同時に持つことができます。これにより、コードの柔軟性と抽象化が高まり、コードが少ないため、より複雑な関数を作成できます。

PHPの高次関数の例を提供できますか?

もちろん、PHPの

関数を考えてみましょう。これは高次関数です。コールバック関数と配列をパラメーターとして使用し、アレイの各要素にコールバック関数を適用し、結果を含む新しい配列を返します。

<code class="language-php">// 我们将传递给高阶函数的简单用户定义函数
function echoHelloWorld() {
  echo "Hello World!";
}

// 接受函数作为输入并调用它的高阶函数
function higherOrderFunction(callable $func) {
  $func();
}

// 调用我们的高阶函数并传入我们的echoHelloWorld()函数。
// 请注意,我们只将名称作为字符串传递,没有括号。
// 这将输出 "Hello World!"
higherOrderFunction('echoHelloWorld'); </code>

PHPで高次関数を使用することの利点は何ですか?

PHPの高次関数は、複数の利点を提供します。これらは、より抽象的で簡潔なコードを可能にし、読みやすさと保守性を向上させることができます。また、コードの複製と複雑さを軽減し、コードをより効率的でデバッグしやすくすることもできます。さらに、さまざまな動作を達成するために異なる関数を高次関数に渡すことができるため、高次関数はコードの再利用を促進できます。

PHPで高次関数を使用することの欠点はありますか?

高次関数は多くの利点を提供しますが、いくつかの欠点もある場合があります。特に機能的なプログラミングの概念に精通していない開発者にとって、彼らは時々コードを理解してデバッグするのを難しくします。さらに、高次関数を使用すると、他の関数の作成と呼び出しが必要なため、パフォーマンスのオーバーヘッドにつながる場合があります。

PHPで独自の高次関数を作成する方法は?

PHPで独自の高次関数を作成するには、1つ以上の関数をパラメーターとして受け入れることができる関数を定義するか、結果として関数を返す、または両方の特性を持つ必要があります。以下は、関数を引数として取得し、値に適用する単純な高次関数の簡単な例です。

PHPの高次関数は複数の関数を返すことができますか?
<code class="language-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  ');</code>

はい、PHPの高次関数は複数の関数を返すことができます。これは通常、一連の関数を返すことによって行われます。ただし、返された各関数には独自の範囲があり、他の返された関数と変数を共有していないことを忘れないでください。

PHPの高次関数は、異なるスコープから関数を受け入れることができますか?

はい、PHPの高次関数は、異なるスコープからの関数を受け入れることができます。これは、PHPがファーストクラスの関数をサポートしているためです。つまり、関数は他の関数にパラメーターとして渡され、他の関数によって返され、変数に割り当てられるためです。

PHPの高次関数と閉鎖の関係は何ですか?

PHPの閉鎖は、周囲のスコープで変数をキャプチャする匿名関数です。それらは、パラメーターよりも多くのデータにアクセスする関数を作成できるため、高次関数でよく使用されます。これは、より柔軟で再利用可能なコードを作成するのに非常に役立ちます。

PHPに組み込みの高次関数はありますか?

はい、PHPはいくつかの組み込みの高次関数を提供します。いくつかの例には、

が含まれます。これらの関数は、コールバック関数を引数として取得し、さまざまな方法で配列の要素に適用します。 array_map

以上がPHPにおける機能プログラミング:高次関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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