ホームページ  >  記事  >  バックエンド開発  >  PHP ノート: AOP_PHP チュートリアルの適用

PHP ノート: AOP_PHP チュートリアルの適用

WBOY
WBOYオリジナル
2016-07-21 15:12:00788ブラウズ

はじめに

AOP (アスペクト指向プログラミング) について聞いたことがありますか? AOP は PHP ではあまり使用されていないように見えますが、エンタープライズ レベルの開発では広く使用されています。この記事では、PHP の AOP について紹介します。

この記事では主にAOPの概念について説明します。


AOPとは何ですか?

アプリケーション開発では、多くの機能が必要になり、それらの機能がコード内の複数の箇所に散在していることがよくありますが、これらの箇所は実際には実際のビジネスとは何の関係もありません。たとえば、いくつかの特別なタスクを実行する前に、ユーザーがログインしていることを確認する必要があります。これらの特別な人々を「横断的な関心事」と呼びます。「横断的な関心事」(水平的な関心事) の定義を理解するために、Wikipedia を使用してみましょう。関係) 。
コンピューター サイエンスでは、「横断的な関心事」は「アスペクト (または方向) プログラミング」を指します。これらの関係は他のシステム (フレームワーク設計または実装) から十分に分解されていないため、コードの重複、システム内での意味のある依存関係、またはその両方が存在します。
これで、「水平関係」の基本を理解できたはずです。コードでどのように見えるかを見てみましょう。

あなたがブログ サイトの編集者であるシナリオを想定してください。サイトにログインして、投稿の作成、投稿の確認、投稿の編集などを行う必要があります。ログインしていない場合は、ログイン画面に直接移動する必要があります。これらの動作が安全であることを確認するには、上記の操作のいずれかを効果的に検証する必要があります。コードは次のとおりです。 // ログインにリダイレクトします
;

パブリック関数approvePost() { } ️ } public Public Function ViewPost(){
上記のコードを見ると、各メソッドの前に checkAuthentication() が呼び出されていることがわかります。これは、これらのアクションを実行する前にユーザーがログインする必要があるためです。新しい投稿を作成できるように、管理者アカウントであるかどうかを識別するためのnotifyAdmin()もあります。多くの「重複コード」があり、BlogPost クラスは投稿の管理のみを担当する必要があることがわかりましたか。検証と識別は分離する必要があります。私たちは「単一責任原則」に違反しました。

単一責任の原則は、各クラスが 1 つの責任 (タスク) のみを持つべきであり、責任全体が 1 つのクラスにカプセル化される必要があることを示しています。すべてのサービスは、責任に応じて厳密かつバランスの取れた方法で配分される必要があります。

ここまでのところ、AOP が何を意味するのか理解できました。水平方向のアスペクト関係は、「アスペクト」と呼ばれるクラスにグループ化されます。アスペクト指向の関係をコア コードから分離するプロセスは、アスペクト指向プログラミングと呼ばれます。

AOP 専門用語

AOP の特性を説明するために特に使用される条件が多数あります。これらの条件を理解することが、AOP をプロジェクトに正常に統合するための鍵となります。
アスペクト
アドバイス
ジョインポイント
ポイントカット
アスペクト(Aspect)とは何かを学びました!さて、他の 3 つの条件が何を意味するのか理解しましょう。

アドバイス
アドバイスは、その名前が示すように、特定の状況で何をいつ行うかを定義するために使用されます。前の例では、checkAuthentication (何をすべきか) はアドバイス (通知) であり、指定されたメソッドではコードが実行される前 (実行されるとき) に呼び出される必要があります。


Joinpoint (アクセスポイント)
Joinpoint はアドバイス アプリケーションを作成する場所です。前のコードをもう一度見ると、ビジネス ロジックに直接関係のないいくつかの関数を呼び出していることがわかります。たとえば、createPost() では、検証ロジックを実行する前と管理者にメッセージを送信した後に、横断的な問題が発生する必要があります。これらはすべてアクセス ポイントである可能性があります。

アクセス ポイントはアプリケーション コード内のどこにでも配置できます。ただし、Advice は、後で説明する AOP フレームワークに応じて、特定の時点でのみデプロイできます。

Pointcut
Pointcut は、通知を特定のアクセス ポイントに一致させる方法を定義します。この例にはアクセス ポイントのペアしかありませんが、アプリケーションには数千のアクセス ポイントを含めることができ、すべてのアクセス ポイントに通知を適用する必要はありません。必要と思われる数のアクセス ポイントを通知にバインドできます。

createPost()、approvePost()、editPost()に通知したいが、viewPost()がないとします。何らかのメソッドを使用して、これら 3 つのメソッドを通知にバインドします。次に、アスペクトの詳細を含む XML ファイルを作成します。このファイルには、アクセス ポイントに一致するいくつかの正規表現が含まれています。

要約: アプリケーションに水平切断関係がある場合、ポイント切断の使用を選択する一部のアクセス ポイントに通知機能を適用するアスペクトを作成できます。


AOP 通知タイプ

通知コードはさまざまな方法で表現できます。これらの通知コードは使用しているフレームワークに依存すると前述しましたが、理解しておく必要があるタイプがいくつかあります。以下を参照してください:
事前通知
復帰後通知
スロー後通知
ペリフェラル通知

事前通知
コード内の特別なポイント (通常はメソッド呼び出し) の前にアドバイスを使用します。

これまでのところ、概念を単純化し、コードをより早く理解できるようにするために、通知をメソッドに記述することがよくあります。しかし、実際の環境では、通知がメソッドに記述されていないことがよくあります。独立したコントローラーが存在し、各メソッドがこのコントローラー内にあり、各メソッドが AOP 機能をラップする必要があります。このグローバル コントローラーはシステム全体で実行されており、私たちには見えません。

コードをコピーします コードは次のとおりです:

class PathController
{
Function controlPaths($className, $funcName) {
Authentication::checkAuthentication();
$ classObj = new $className( );
$classObj->$funcName();

ここではそのようなクラスが存在すると仮定しており、主にこのクラスで実際に何が起こるかを示すために使用されます。 controlPaths メソッドがアプリケーションのグローバル エントリ ポイントであり、アプリケーション内のすべてのメソッドにこのメソッドを通じてアクセスする必要があるとします。上記のメソッドでは、各メソッドを実行する前に、通知 checkAuthentication() を呼び出します。 ——これが事前通知です。



復帰後の通知
この通知は、指定された機能の実行後に一度だけ実行され、そのアクセスポイントに戻ります。次のコードを考えてみましょう。 コードをコピーします

コードは次のとおりです: & lt ;? PHPClass PathController
{
Function Controlpaths ($ ClassName, $ Funcname) {
$ classobj = new $ classna me () ;) $classObj->$funcName();
Database::closeConnection();
}
}


ここで、Ctrl+C を押して、メソッドの完了後にデータベースをクリーンアップしていることに注意してください。リソース。通知を返した後、この通知を呼び出します。


スロー後の通知
関数の実行処理中に例外がスローされた場合、例外がスローされた後に通知が適用されます。ここで、例外がスローされた後、通知はエラー メッセージになります。コードのコピー


コードは次のとおりです。関数名();
ペリフェラル通知

4 番目の通知はペリフェラル通知で、事前通知と復帰後通知を組み合わせたものです。

コードをコピーします
コードは次のとおりです:


= new $className( );



http://www.bkjia.com/PHPjc/326806.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/326806.html

技術記事

はじめに AOP (アスペクト指向プログラミング) について聞いたことがありますか? AOP は PHP ではあまり使用されていないように見えますが、エンタープライズ レベルの開発では広く使用されています。この記事を使わせていただきます...



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