ホームページ  >  記事  >  バックエンド開発  >  PHPクロージャの詳しい説明とサンプルコード

PHPクロージャの詳しい説明とサンプルコード

高洛峰
高洛峰オリジナル
2016-12-30 13:51:42927ブラウズ

クロージャと匿名関数は PHP5.3.0 で導入されました。

クロージャとは、作成時に周囲の状態をカプセル化する関数を指します。クロージャが配置されている環境が存在しなくなっても、クロージャにカプセル化された状態は依然として存在します。

理論的には、クロージャと匿名関数は異なる概念です。しかし、PHP ではこれを同じ概念として扱います。

実際には、クロージャと匿名関数は関数に見せかけたオブジェクトです。これらは Closure クラスのインスタンスです。

クロージャは、文字列や整数と同様、第一級の値型です。

クロージャの作成

<?php
$clousre = function ($name) {
return &#39;Hello &#39; . $name;
};
echo $closure(&#39;nesfo&#39;);

$closure 変数を呼び出すことができる理由は、この変数の値がクロージャであり、クロージャ オブジェクトが __invoke() マジック メソッドを実装しているためです。変数名の後に () がある限り、PHP は __invoke() メソッドを見つけて呼び出します。 PHP クロージャーは通常、関数のコールバックとして使用されます。 array_map() メソッドと preg_replace_callback() メソッドはすべてコールバック関数を使用します。クロージャを使用するのに最適な時期です。

例:

<?php
$numbersPlusOne = array_map(function ($number) {
return $number + 1;
}, [1, 2, 3]);
print_r($numbersPlusOne);

は次の結果を取得します:

[2, 3, 4]

クロージャの前は、名前付き関数を個別に作成し、その関数を名前で参照することしかできませんでした。これを行うと、コードの実行が若干遅くなり、コールバックの実装が使用シナリオから分離されます。

<?php
function incrementNum ($number) {
return $number + 1;
}
$numbersPlusOne = array_map(&#39;incrementNum&#39;, [1, 2, 3]);
print_r($numbersPlusOne);

追加のステータス

匿名関数はコールバックとして使用できるだけでなく、PHP のステータスにアタッチしてカプセル化することもできます。

PHP では、クロージャ オブジェクトの bindingTo() メソッドを手動で呼び出すか、use キーワードを使用して状態を PHP クロージャにアタッチする必要があります。

<?php
function enclosePerson ($name) {
return function ($doCommand) use ($name) {
return $name . &#39;, &#39; . $doCommand;
}
}
$clay = enclosePerson(&#39;Clay&#39;);
echo $clay(&#39;get me sweet tea!&#39;);

結果を取得します:

「クレイ、甘いお茶を買ってきて!」

PHP クロージャはオブジェクトであり、各クロージャ インスタンスは $this キーワードを使用してクロージャの内部状態を取得できます。クロージャ オブジェクトのデフォルト状態は役に立ちません。使用できるのは __invoke() メソッドと bindingTo メソッドだけです。

bindTo() メソッドを使用して、Closure オブジェクトの内部状態を他のオブジェクトにバインドできます。

bindTo() メソッドの 2 番目のパラメーター: その機能は、バインディング クロージャのオブジェクトが属する PHP クラスを指定することです。したがって、クロージャは、クロージャがバインドされているオブジェクトの保護されたプライベート メンバにアクセスできます。

PHP フレームワークは、多くの場合、bindTo() メソッドを使用して、ルーティング URL を匿名コールバック関数にマップします。これにより、$this キーワードを使用して、この匿名関数内の重要なアプリケーション オブジェクトを参照できます。

bindTo()メソッドを使用して閉鎖ステータスを添付します

<?php
class App
{
protected $routes = [];
protected $responseStatus = &#39;200 OK&#39;;
protected $responseContentType = &#39;text/html&#39;;
protected $responseBody = &#39;Hello world&#39;;
public function addRoute($routePath, $routeCallback){
$this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__);
}
public function dispatch($currentPath){
foreach($this->routes as $routePath => $callback){
if ($routePath === $currentPath) {
$callback();
}
}
header(&#39;HTTP/1.1&#39; . $this->responseStatus);
header(&#39;Content-type: &#39; . $this->responseContentType);
header(&#39;Content-length&#39; . mb_strlen($this->responseBody));
echo $this->responseBody;
}
}
<br>
<?php
$app = new App();
$app->addRoute(&#39;/user/nesfo&#39;, function () {
$this->responseContentType = &#39;application/json; charset=utf8&#39;;
$this->responseBody = &#39;{"name": "nesfo"}&#39;;
});
$app->dispatch(&#39;/user/nesfo&#39;);

上記はPHP閉鎖情報の収集です。今後もこのサイトをサポートしていただきありがとうございます。

PHP クロージャーの詳細とコード例に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

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