PHPクロージャの詳しい説明とサンプルコード
クロージャと匿名関数は PHP5.3.0 で導入されました。
クロージャとは、作成時に周囲の状態をカプセル化する関数を指します。クロージャが配置されている環境が存在しなくなっても、クロージャにカプセル化された状態は依然として存在します。
理論的には、クロージャと匿名関数は異なる概念です。しかし、PHP ではこれを同じ概念として扱います。
実際には、クロージャと匿名関数は関数に見せかけたオブジェクトです。これらは Closure クラスのインスタンスです。
クロージャは、文字列や整数と同様、第一級の値型です。
クロージャの作成
<?php $clousre = function ($name) { return 'Hello ' . $name; }; echo $closure('nesfo');
$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('incrementNum', [1, 2, 3]); print_r($numbersPlusOne);
追加のステータス
匿名関数はコールバックとして使用できるだけでなく、PHP のステータスにアタッチしてカプセル化することもできます。
PHP では、クロージャ オブジェクトの bindingTo() メソッドを手動で呼び出すか、use キーワードを使用して状態を PHP クロージャにアタッチする必要があります。
<?php function enclosePerson ($name) { return function ($doCommand) use ($name) { return $name . ', ' . $doCommand; } } $clay = enclosePerson('Clay'); echo $clay('get me sweet tea!');
結果を取得します:
「クレイ、甘いお茶を買ってきて!」
PHP クロージャはオブジェクトであり、各クロージャ インスタンスは $this キーワードを使用してクロージャの内部状態を取得できます。クロージャ オブジェクトのデフォルト状態は役に立ちません。使用できるのは __invoke() メソッドと bindingTo メソッドだけです。
bindTo() メソッドを使用して、Closure オブジェクトの内部状態を他のオブジェクトにバインドできます。
bindTo() メソッドの 2 番目のパラメーター: その機能は、バインディング クロージャのオブジェクトが属する PHP クラスを指定することです。したがって、クロージャは、クロージャがバインドされているオブジェクトの保護されたプライベート メンバにアクセスできます。
PHP フレームワークは、多くの場合、bindTo() メソッドを使用して、ルーティング URL を匿名コールバック関数にマップします。これにより、$this キーワードを使用して、この匿名関数内の重要なアプリケーション オブジェクトを参照できます。
bindTo()メソッドを使用して閉鎖ステータスを添付します
<?php class App { protected $routes = []; protected $responseStatus = '200 OK'; protected $responseContentType = 'text/html'; protected $responseBody = 'Hello world'; 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('HTTP/1.1' . $this->responseStatus); header('Content-type: ' . $this->responseContentType); header('Content-length' . mb_strlen($this->responseBody)); echo $this->responseBody; } } <br>
<?php $app = new App(); $app->addRoute('/user/nesfo', function () { $this->responseContentType = 'application/json; charset=utf8'; $this->responseBody = '{"name": "nesfo"}'; }); $app->dispatch('/user/nesfo');
上記はPHP閉鎖情報の収集です。今後もこのサイトをサポートしていただきありがとうございます。
PHP クロージャーの詳細とコード例に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
