ホームページ  >  記事  >  バックエンド開発  >  PHP の AOP 思考の分析

PHP の AOP 思考の分析

不言
不言オリジナル
2018-07-04 16:46:463975ブラウズ

この記事では、主に PHP の AOP 思考の分析を紹介します。これは、一定の参考価値があります。今、それを皆さんに共有します。必要な友人は、それを参照してください。

ストーリーの背景:

質問:

従来の OOP (オブジェクト指向プログラミング) の考え方では、アプリケーションは通常、高い凝集性と弱い結合を強調して複数のオブジェクトに分解され、それによってアプリケーション モジュールが改善されます。ただし、特定の問題に対処する場合、OOP は適用されません。

たとえば、アプリケーション内の多くのビジネス ロジックは、操作の開始時に「権限チェック」を実行し、操作の後に「権限チェック」を実行する必要があります。これらの操作を処理するコードが各モジュールに直接追加すると、間違いなく OOP の「単一責任」原則が破壊され、モジュールの再利用性が大幅に低下します。対応するプロキシ層を追加してシステムの機能要件を満たしますが、このような処理は明らかにシステム全体に分割層を追加し、その分複雑さも増し、人に過度の重さを感じさせます。

解決策:

このような問題に対処するために、AOP (アスペクト指向プログラミング) という考え方が生まれました。 OOP の鋭いエッジはシステムを垂直に切り込み、システムを多くのモジュール (ユーザー モジュール、記事モジュールなど) に分割することですが、AOP の鋭いエッジはシステムを水平に切り込むことです。各モジュールで繰り返しの操作が必要となる可能性のある部分を抽出します (権限チェック、ロギングなど)。 AOP が OOP を効果的に補うものであることがわかります。

現在の PHP に関する限り、AOP の完全な組み込み実装はまだありません。RunKit は登場しましたが、常に BETA 状態で PECL プロジェクトに留まっています。長い間 PHP になる可能性は低いです。デフォルト設定。ということは、PHP では AOP が壊れているということでしょうか?もちろんそうではありません。__get()、__set()、__call() などの魔法のメソッドがあるためです。これらのメソッドを適切に使用すると、ある程度の「準 AOP」機能を実現できます。準 AOP であるのは、単純に実装の観点から見ると、AOP と呼ぶのは少し突飛ですが、効果の観点から見ると、AOP の役割を部分的に実現しているためです。実装は完全ではありませんが、一般的な使用には十分です。

<?php
class BIZ
{     
public function foobar($num)
     {          
     print_r($num);          
     echo "\n业务逻辑 do something";
     }
}
class AOP{     
private $instance;     
public function __construct($instance){          
$this->instance = $instance;
     }     
     public function __call($method,$argument) {          
     if (!method_exists($this->instance, $method)) {               
     throw new Exception(&#39;未定义的方法:&#39; . $method);
          }          
          echo "\n权限检查"; //--------------AOP
          $callBack = array($this->instance,$method);          
          $return = call_user_func($callBack,$argument);          
          echo "\n日志记录"; //--------------AOP
          return $return;
     }
}
class Factory
{     
public static function getBizInstance()
     {          
     return new AOP(new BIZ());
     }
}
try {    
 $obj = Factory::getBizInstance();     
 $obj->foobar(3);
} 
catch (Exception $e) {     
echo &#39;Exception &#39;.$e->getMessage();
}
/**
 * 总结:
 * 整个的实现思路其实很简单,关键就是客户端请求的对象不能直接实例化出来,
 * 而是利用工厂方法返回一个请求对象的包装对象,在包装对象内利用魔术方法来处理权限处理,日志记录等公共操作。
 * 这既是巧妙的地方,也是最有可能出问题的地方,因为客户端使用对象并不是它想象中的对象,
 * 而是一个包装后的对象,比如说,客户端通过getBizInstance()方法以为得到的对象是BIZ,
 * 但实际上它得到的是一个BIZ的包装对象AOP,这样的话,如果客户端进行一些诸如get_class()之类
 * 和对象类型相关的操作就会出错,当然,大多数情况下,客户端似乎不太会做类似的操作
 */

以上がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP の仕組みの基本


PHP で短いリンクを生成する方法

以上がPHP の AOP 思考の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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