ホームページ  >  記事  >  バックエンド開発  >  PHP アスペクト指向プログラミング コンポーネント_PHP チュートリアル

PHP アスペクト指向プログラミング コンポーネント_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:47:111060ブラウズ

私たちは CI、YII、cakePHP などの MVC フレームワークを使用しています。その理由の 1 つは、コードの保守が容易になることです。

しかし、ビジネス ロジックが複雑になるにつれて、コントローラー内のモデル内のメソッドを呼び出すことはますます面倒になります。

アスペクト指向プログラミングの考え方は、変化するビジネス ロジックを解決し、保守しやすいコードを書くためのソリューションの 1 つです。


以下はAOPの考え方に基づいて設計されたアスペクト指向コンポーネントのソースコードです。

if (function_exists('__autoload')) {
    trigger_error("拡張機能: コードが __autoload() 関数を使用しているようです。拡張機能は spl_autoload_register() を使用しているため、__autoload() 関数がバイパスされ、自動ロードが中断される可能性があります。", E_USER_WARNING); 
}
 
spl_autoload_register(array('ExtensionFactory', 'autoload')); 
 
クラス ExtensionFactory {
     
    プライベート静的 $extFamily = null; 
    private static $_classes = array(
        '拡張子' =>  '/Extension.php'、
        'ExtensionFamily' =>  '/ExtensionFamily.php'
    ); 
     
    /**
     * クラスオートローダー。このメソッドは、
内で呼び出すために提供されています。      * __autoload() マジックメソッド
     * @param string $className ロードするクラスの名前。
    */
    パブリック静的関数 autoload() {
        foreach(self::$_classes as $v){
            require_once dirname(__FILE__) 。 $v; 
        }
    }
     
    /**
* addExtensionremoveExtension などを呼び出す前に、このメソッドを最初に呼び出して拡張機能ファミリーをインスタンス化する必要があります
* @return ExtensionFamily
​​*/
    パブリック静的関数 createExtension(){
        self::$extFamily = 新しい ExtensionFamily(); 
        self::$extFamily を返します。 
    }
     
    パブリック静的関数removeExtension($extName){
        if(is_null(self::$extFamily)){
            throw new Exception("最初に拡張機能を作成してください"); 
            false を返します。 
        }その他{
            unset(self::$extFamily->_extensionArray[$extName]); 
        }
    }
     
    パブリック静的関数 addExtension($extName, Extension $ext){
        if(is_null(self::$extFamily)){
            throw new Exception("最初に拡張機能を作成してください"); 
            false を返します。 
        }その他{
            self::$extFamily->_extensionArray[$extName] = $ext; 
        }
    }
     
    パブリック静的関数removeAllExtension(){
        if(is_null(self::$extFamily)){
            throw new Exception("最初に拡張機能を作成してください"); 
            false を返します。 
        }その他{
            foreach(self::$extFamily->_extensionArray as $extName=>$ext){
                unset(self::$extFamily->_extensionArray[$extName]); 
            }
        }
    }
}
if (function_exists('__autoload')) {
 trigger_error("拡張機能: コードが __autoload() 関数を使用しているようです。拡張機能は spl_autoload_register() を使用しているため、__autoload() 関数がバイパスされ、自動ロードが中断される可能性があります。", E_USER_WARNING);
}

spl_autoload_register(array('ExtensionFactory', 'autoload'));

クラス ExtensionFactory {
   
    プライベート静的 $extFamily = null;
    プライベート静的 $_classes = array(
        '拡張子' =>  '/Extension.php',
        'ExtensionFamily' =>  '/ExtensionFamily.php'
    );
   
    /**
     * クラスオートローダー。このメソッドは
内で呼び出すために提供されています。      * __autoload() マジックメソッド
     * @param string $className ロードするクラスの名前。
    */
    パブリック静的関数 autoload() {
        foreach(self::$_classes as $v){
            require_once dirname(__FILE__) 。 $v;
        }
    }
   
    /**
* addExtensionremoveExtension などを呼び出す前に、このメソッドを最初に呼び出して拡張機能ファミリーをインスタンス化する必要があります
* @return ExtensionFamily
​​*/
    パブリック静的関数 createExtension(){
        self::$extFamily = 新しい ExtensionFamily();
        self::$extFamily を返します;
    }
   
    パブリック静的関数removeExtension($extName){
        if(is_null(self::$extFamily)){
            throw new Exception("最初に拡張機能を作成してください");
            false を返します;
        }その他{
            unset(self::$extFamily->_extensionArray[$extName]);
        }
    }
   
    パブリック静的関数 addExtension($extName, Extension $ext){
        if(is_null(self::$extFamily)){
            throw new Exception("最初に拡張機能を作成してください");
            false を返します;
        }その他{
            self::$extFamily->_extensionArray[$extName] = $ext;
        }
    }
   
    パブリック静的関数removeAllExtension(){
        if(is_null(self::$extFamily)){
            throw new Exception("最初に拡張機能を作成してください");
            false を返します;
        }その他{
            foreach(self::$extFamily->_extensionArray as $extName=>$ext){
                unset(self::$extFamily->_extensionArray[$extName]);
            }
        }
    }
}

 


/**
*大家族
*
* @著者Jinさん
​*/
クラス ExtensionFamily は拡張機能を実装します{
    public $_extensionArray = array(); 
     
    /**
*
* @param 型 $extName 拡張子
* @param Extension $ext Extensionを実装するオブジェクト
​​*/
    パブリック関数 addExtension($extName, Extension $ext){
        $this->_extensionArray[$extName] = $ext; 
    }
     
    public function beforeAppend(&$params){
        foreach($this->_extensionArray as $ext){
            $ext->beforeAppend($params); 
        }
    }
     
    パブリック関数 afterAppend(&$params) {
        foreach($this->_extensionArray as $ext){
            $ext->afterAppend($params); 
        }
    }
}
 
?> 
/**
*大家族
*
* @著者Jinさん
​*/
クラス ExtensionFamily は Extension{
を実装します     public $_extensionArray = array();
   
    /**
*
* @param 型 $extName 拡張子
* @param Extension $ext Extensionを実装するオブジェクト
​​*/
    パブリック関数 addExtension($extName, Extension $ext){
        $this->_extensionArray[$extName] = $ext;
    }
   
    パブリック関数 beforeAppend(&$params){
        foreach($this->_extensionArray as $ext){
            $ext->beforeAppend($params);
        }
    }
   
    パブリック関数 afterAppend(&$params) {
        foreach($this->_extensionArray as $ext){
            $ext->afterAppend($params);
        }
    }
}

?>

/**
*拡張インターフェース
*
* @著者Jinさん
​*/
インターフェース拡張子 {
    パブリック関数 beforeAppend(&$params); 
     
    パブリック関数 afterAppend(&$params); 
}
 
?> 
/**
*拡張インターフェース
*
* @著者Jinさん
​*/
インターフェース拡張子 {
    パブリック関数 beforeAppend(&$params);
   
    パブリック関数 afterAppend(&$params);
}

?>

上記の 3 つのファイルは、単一の AOP コンポーネントを実現します。

 

以下はデモです:

/**
* カスタム拡張機能
* ユーザーポイント延長
※ユーザーがログインしているかどうかに応じて、今回の消費に対してユーザーポイントを記録するかどうかが決まります
*
* @著者Jinさん
​*/
class ExampleExtension は拡張機能 {
を実装します     パブリック $check=false; 
     
    public function beforeAppend(&$isLogin) {
        if($isLogin){
            $this->check = true; 
        }
    }
     
    パブリック関数 afterAppend(&$pointer) {
        if($this->check){
            // ポインタを追加
        }その他{
            echo '未登录用户,积分不录入'; 
            戻る; 
        }
    }
 
}
 
?> 
/**
* カスタム拡張機能
* ユーザーポイント延長
※ユーザーがログインしているかどうかに応じて、今回の消費に対してユーザーポイントを記録するかどうかが決まります
*
* @著者Jinさん
​*/
class ExampleExtension は拡張機能 {
を実装します  パブリック $check=false;
   
    パブリック関数 beforeAppend(&$isLogin) {
        if($isLogin){
         $this->check = true;
        }
    }
   
    パブリック関数 afterAppend(&$pointer) {
        if($this->check){
         //ポインターを追加します
        }その他{
         echo '未登录用户,积分不录入';
         戻ります;
        }
    }

}

?>

 


デモ.php
require_once('ExtensionFactory.php');//导入组件本身
 
require_once('ExampleExtension.php');//导入扩展
 
$ext = ExtensionFactory::createExtension(); 
 
ExtensionFactory::addExtension('example', new ExampleExtension());//积分录入機能
 
/*
 * 必要な写真の変更には、対応する拡張機能を追加することができます。
 * 例:
 * 新しい要求: 新しい会議の種類、異なる種類に応じて、価格優遇を実行します。  * 实现思路:
 * 一、建立卡号类型工厂
 * 二、建立SeniorMemberExtension、PuTongMeberExtension.
 * 三、工厂方法会员类型addExtensionによる
 */
 
$isLogin = false; //假设用户未登录
 
$ext->beforeAppend($isLogin); 
 
 
/**
※ アスペクト指向プログラミングで最も重要な点は、まず業務プロセス全体のどの部分に焦点を当てているかを分析する必要があることです。
※ここでの焦点は注文の倉庫管理です。
* 注文が倉庫に入れられる前に、ログイン確認、カード残高確認などのビジネス ロジックが引き続き増加する可能性があります。
* 注文が保管された後: ポイント処理、注文監視など
​*/
echo "此处是主业务逻辑:订单入库rn"; 
 
$ポインタ = 100; 
 
$ext->afterAppend($pointer); 
require_once('ExtensionFactory.php');//导入组件本身

require_once('ExampleExtension.php');//导入扩展

$ext = ExtensionFactory::createExtension();

ExtensionFactory::addExtension('example', new ExampleExtension());//积分录入機能

/*
* 需要の変化に応じて、対応する拡張機能を追加できます。
*例:
* 新しい要件: 新しい会員タイプを追加し、さまざまなタイプに応じた価格割引を提供します。
* 実装アイデア:
※1.カード番号型工場を設立
* 2. SeniorMemberExtension と PuTongMeberExtension を作成します。
* 3. ファクトリメソッドはメンバーの種類に応じてaddExtension
を追加します */

$isLogin = false; //ユーザーはログインしていないと仮定します

$ext->beforeAppend($isLogin);


/**
※ アスペクト指向プログラミングで最も重要な点は、まず業務プロセス全体のどの部分に焦点を当てているかを分析する必要があることです。
※ここでの焦点は注文の倉庫管理です。
* 注文が倉庫に入れられる前に、ログイン確認、カード残高確認などのビジネス ロジックが引き続き増加する可能性があります。
* 注文が保管された後: ポイント処理、注文監視など
​*/
echo "これが主なビジネス ロジックです: order storage rn";

$pointer = 100;

$ext->afterAppend($pointer);
実行結果:
主なビジネス ロジックは次のとおりです: 注文倉庫
ログインしていないユーザーの場合、ポイントは加算されません

神様のブログより抜粋

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478518.html技術記事私たちは CI、YII、cakePHP などの MVC フレームワークを使用しています。その理由の 1 つは、コードの保守が容易になることです。 しかし、ビジネス ロジックが複雑になるにつれて、コントローラー内のモデル内のメソッドを呼び出すことがますます増えていきます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。