15

「Magento PHP 開発者ガイド」の第 2 章には、次のように記載されています。

Zend Framework 2 は 100% オブジェクト指向のコードを使用し、PHP 5.3 の新機能のほとんど (名前空間、遅延静的バインディング、ラムダ関数、およびクロージャー) を利用しています。

「クロージャー」と「ラムダ」の違いは何ですか? いくつかの答えがあります(ラムダは単なる無名関数であり、クロージャーはパラメーターリストにない変数にアクセスできる関数であるなど)、Pythonプログラミング言語に固有のようです(Schemeについての言及もあります)プログラミング言語)。たとえば、投稿によると、Python では、ラムダではないクロージャと、クロージャではないラムダが存在する可能性があるようです。

ただし、Python ではなく PHP プログラミング言語に興味があります。以下の回答の 1 つは、PHP ではすべてのクロージャーがラムダであることを指摘しているようです。これは、Python に関する投稿の内容と矛盾します。

これらの概念は言語ごとに詳細が異なるように思われ、PHP に興味があるため、この投稿を行います。

これはすべて紛らわしいです。一般に、ラムダ関数は名前のない関数にすぎないと思いますが、次のウィキペディアの記事でクロージャーについて詳しく説明しています。

http://en.wikipedia.org/wiki/Closure_%28computer_science%29

ただし、PHP には例がありません。

4

5 に答える 5

24

クロージャーは、変数をカプセル化する php のラムダ関数であり、元の参照がスコープ外になったときに使用できるようにします。

クロージャはラムダ関数ですが、useキーワードを指定しない限り、ラムダ関数はクロージャではありません。

これははるかに良い答えです: https://stackoverflow.com/a/220728/1152375

于 2013-11-12T14:08:16.060 に答える
7

Lambda 関数は、変数に割り当てられるか、パラメーターとして別の関数に渡されます。クロージャーは、そのスコープ外の変数を利用します。

ラムダの使用

関数には名前がないため、通常の関数のように呼び出すことはできません。代わりに、変数に代入するか、別の関数に引数として渡す必要があります。

// Anonymous function
// assigned to variable
$greeting = function () {
  return "Hello world";
}

// Call function
echo $greeting();
// Returns "Hello world"

無名関数をそのように使用するには、それを変数に割り当ててから、その変数を関数として呼び出します。

次のように、関数を別の関数に渡すこともできます。

// Pass Lambda to function
function shout ($message){
  echo $message();
}

// Call function
shout(function(){
  return "Hello world";
});

閉鎖とは何ですか?

Closure は、作成されたスコープ外の変数にアクセスできることを除けば、本質的に Lambda と同じです。

例えば:

// Create a user
$user = "Philip";

// Create a Closure
$greeting = function() use ($user) {
  echo "Hello $user";
};

// Greet the user
$greeting(); // Returns "Hello Philip"

$user上記のように、Closure 関数定義の use 句で変数が宣言されているため、Closure は変数にアクセスできます。

$userクロージャー内で変数を変更しても、元の変数には影響しません。元の変数を更新するには、アンパサンドを追加します。変数の前のアンパサンドは、これが参照であることを意味するため、元の変数も更新されます。

For example:
// Set counter
$i = 0;
// Increase counter within the scope
// of the function
$closure = function () use ($i){ $i++; };
// Run the function
$closure();
// The global count hasn't changed
echo $i; // Returns 0

// Reset count
$i = 0;
// Increase counter within the scope
// of the function but pass it as a reference
$closure = function () use (&$i){ $i++; };
// Run the function
$closure();
// The global count has increased
echo $i; // Returns 1

このテキストは、>> culttt.comにある Philip Brown の記事の一部です。そこにはさらにいくつかの例があります。

于 2017-01-04T06:36:36.563 に答える
3

詳細な説明とコード例を含む PHP 固有の記事があります: http://www.ibm.com/developerworks/library/os-php-5.3new2/

リンク切れの警告: 2014 年 10 月 18 日現在、上記のリンクは 404 です。Google キャッシュから記事をコピーして、ここに配置しました:

元のドキュメントがどこかに再表示されているのを見つけた場合は、お知らせください。

于 2014-05-07T15:57:13.227 に答える
0

クロージャーとは実際にはuse、変数の場合、その値がクローズド関数内で使用され、その値を外部で更新しないことを意味します。&使用された変数の値を更新したいが、通常の引数として使用したい場合は、代わりに参照演算子を使用する必要があります。

これは、グローバル名前空間に依存する通常の関数を使用せずに、このようなものをイン/デクリメントしたり、フィボナッチを作成したり、ジェネレーター関数を簡単に反復したりできる強力な用途です。

ラムダはサポートしていないためuse、外側のスコープから変数を囲むことはできません。また、クロージャーをキャッシュできるため、コンパイルのパフォーマンスが向上します。

于 2016-09-17T16:48:30.170 に答える