<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Xaop高性能 PHP AOP 擴(kuò)展

          聯(lián)合創(chuàng)作 · 2023-09-30 06:57

          Xaop —— PHP高性能的AOP擴(kuò)展

          功能特色

          • 文檔注解AOP模式

          • 方法注入AOP模式

          啟用對(duì)應(yīng)功能擴(kuò)展需要在 php.ini 文件配置指令: xaop.aop_mode,如下:

            ; To enable the AOP mode
            ; 1 不啟用AOP
            ; 2 文檔注解AOP模式
            ; 3 方法注入AOP模式
            xaop.aop_mode = 3

          1、文檔注解AOP模式 DEMO:

            <?php
             
            /**
             *@Aspect
             */
            class Swing
            {
                public function _before() {
                    echo '_before';
                }
                
                /**
                 *@before(value="Xaop._before")
                 */
                public function goodLists() {
                    echo 'goodLists';
                }
            }

          因?yàn)榛?nbsp;ZendOPcode,所以不需要使用代理對(duì)象完成切面,直接調(diào)用方法 即可:

            <?php
            
            $swig = new Swing();
            $swig->goodLists();
            
            // 輸出如下:
            
            _before goodLists

          文檔注解支持 自定義注解 與擴(kuò)展 內(nèi)置注解

          • 自定義注解

            自定義注解必須繼承自 Xaop\Annotation 接口,并且實(shí)現(xiàn) input 方法即可,如下示例自定義了一個(gè) @Tag 注解:

            namespace app;
            
            use Xaop\Annotation;
            
            class Tag implements Annotation {
            
                function input($object, $annotations) {
                    var_dump($object);
            
                    foreach($annotations as $key => $val) {
                        echo $key . '=' . $val . PHP_EOL;
                    }
                }
            }

          使用的時(shí)候只需要傳入全名即可:

            <?php
            
            /**
             * @Aspect
             */
            class Swing
            {
                /**
                 * @app\Tag( money = 5000, user = "Xaop" )
                 */
                public function getMoney() {
                    
                }
            }
          • 內(nèi)置注解

            內(nèi)置強(qiáng)大的六個(gè)專用注解: @api、@disable、@before 、@after、@success、@failure

          1. @api

            開(kāi)發(fā) API 推薦使用,使用本注解,直接可以向客戶端返回 JSON 或者 XML 數(shù)據(jù),只需要在修飾的方法體返回?cái)?shù)據(jù)數(shù)據(jù)即可,注解包含兩個(gè)參數(shù):

            type 與 charset, 如下使用:

              /**
               *@api(type=JSON, charset=UTF-8)
               */
              public function newLists() {
                  return [ ['12' => {xxx,xxx}], ['23'=>{xxx,xxx}] ];
              }

            或者

              /**
               *@api(type=xml, charset=UTF-8)
               */
              public function newLists() {
              
                  return [ ['12' => {xxx,xxx}], ['23'=>{xxx,xxx}] ];
              
              }

            注意:參數(shù)名區(qū)分大小寫,參數(shù)值不區(qū)分大小寫。

          2. @disable

            使用本注解可以禁用類的方法,使用本注解修飾的方法,就不會(huì)調(diào)用,并且不會(huì)提示任何錯(cuò)誤信息,直接返回,本注解不包含任何參數(shù)。

          3. @before

            前置通知,在方法之前執(zhí)行本注解包含的方法:如:

              @before(value="app\models\User.startTransaction")

            在執(zhí)行之前開(kāi)啟事務(wù)支持

          4. @after

            后置通知,在方法之后執(zhí)行本注解包含的方法:如:

              @after(value="app\log\InvokeLog.record")

            在接口調(diào)用之后進(jìn)行日志記錄

          5. @success

            方法體返回 true 的時(shí)候調(diào)用的通知:如:

              @success(value="app\models\User.commit")

            在方法執(zhí)行成功之后提交事務(wù)

          6. @failure

            方法體返回 false之后調(diào)用的通知,如下:

              @failure(value="app\models\User.rollback")

            在方法體返回失敗的時(shí)候回滾事務(wù)

          2、方法注入AOP模式 DEMO:

          僅支持 前置注入后置注入 模式,環(huán)繞模式正在開(kāi)發(fā):

            <?php
            
            class Swing
            {
                public function _before() {
                    echo '_before';
                }
                
                public function getLists() {
                    echo 'getLists';
                }
            }
            
            // 在所有的 Swing類中,以 getLists開(kāi)頭的方法調(diào)用的時(shí)候都會(huì)調(diào)用 Swing類的 _before 方法
            \Xaop::addBeforeAop(Swing::class, "getLists*", [ Swing::class, '_before' ]);
            
            // 后置注入
            // \Xaop::addAfterAop(Swing::class, "getLists*", [ Swing::class, '_after' ]);

          調(diào)用即可:

            $swing = new Swing();
            $swing->getLists();
            
            // 輸出如下:
            _before getLists

          Xaop APIs

          前置注入:addBeforeAop

          public function addBeforeAop($className, $funtionName, $callback = [ ])

          后置注入:addAfterAop

          public function addAfterAop($className, $funtionName, $callback = [ ])

          注意:

          $className與$functionName支持模糊匹配模式,使用 * 代替任意字符,并且只能存在一個(gè) * 符號(hào),存在多個(gè) * 符號(hào)會(huì)報(bào)錯(cuò),如下示例:

            <?php
            
            namespace app;
            
            class Swing
            {
                public function _before() {
                    echo 'before';
                }
                
                public function views() {
                    echo 'views';
                }
            }
            
            // 給 Swing 類的 views 方法增加前置注入
            \Xaop::addBeforeAop(Swing::class, 'views', [ Swing::class, '_before' ] );
            
            // 給 Swing 類中,以 v 開(kāi)頭的方法增加前置注入
            \Xaop::addBeforeAop(Swing::class, 'v*', [ Swing::class, '_before' ]);
            
            // 給以 app 開(kāi)頭的命名空間并且方法以 v 開(kāi)頭的增加前置注入
            \Xaop::addBeforeAop("app*", 'v*', [ Swing::class, '_before' ]);

          [警告??]:如果 $functionName 僅僅存在 字符 *, 此時(shí)系統(tǒng)會(huì)直接終止,由于 * 匹配任何方法,當(dāng)你匹配方法的時(shí)候,如果僅僅使用 * 去匹配任何方法,那么會(huì)造成閉合調(diào)用(調(diào)用本方法之前都調(diào)用本方法),造成PHP內(nèi)核終止。之所以保留單個(gè) * 字符,是因?yàn)?nbsp;$className 可以使用 單個(gè) * 去匹配任何類或者命名空間。

          瀏覽 23
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99黄色视屏 | 天天玩,夜夜操 | 无码人妻一区二区三区免费n鬼沢 | av漫画 免费观看 | 亚洲成人福利视频 |