设为首页 收藏本站
查看: 993|回复: 0

[经验分享] PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-3-9 09:30:47 | 显示全部楼层 |阅读模式
    <?php      

    /**

     * 摘取天上星 版 插件引擎 第二版 version 2.0   

     * By: 摘取天上星!

     * Emali: happy.yin@qq.com

     * Date: 2012升级版

     **/  

      $plugin_arr=array();  

      $plugin_meta=array();  

      $plugin_remove=array();  

      $action_arr=array();  

      $action_meta=array();  

      $action_remove=array();  

      $idx=0;  

      /*

       * 执行插件引擎中捆绑的所有函数事件(函数执行顺序参加addPlugin函数添加插件时的第四个参数数字,数字越大优先级越高)

       * $tag 要执行的函数集插件标签名

       * $args 要往函数中传入的参数,依次按顺序填写,键名同addPlugin添加插件时第三个参数传入的键名、数量对应一致,键名对应的值即传入的参数值,

       * 该插件引擎是有返回值的插件引擎

       */  

      function doPlugin($tag,$args=array()){  

        global $plugin_arr,$plugin_remove;  

        $first=array_search(current($args),$args);  

        if(empty($plugin_arr[$tag])) return $args[$first];  

        if(isset($plugin_remove[$tag])){  

            foreach($plugin_remove[$tag] as $func){  

                removePlugin($tag,$func);  

            }  

        }  

        krsort($plugin_arr[$tag]);  

        foreach($plugin_arr[$tag] as $plugins){  

            foreach($plugins as $plugins){  

                $plugins['args']=array_merge($plugins['args'],$args);  

                $args[$first]=call_user_func_array($plugins['func'],array_slice($plugins['args'],0,$plugins['args_count']));  

            }  

        }  

        return $args[$first];  

      }  

      /* 第一个参数为自定义标签集名,

       * 第二个参数是你要向标签集里添加的函数名,

       * 第三个数组参数为第二个参数strAndStr1函数对应的参数集,有多少个函数参数,就需要添加多少个数组元素,

               参数按照先后顺序依次填写,键值为空即可,且插件里所有函数的参数个数必须一致,一个以上的参数,可多个,

               这里的传参数组只需要预写好键名即可,在调用doPlugin插件时给对应的键值传入键名对应的实际参数值即可

       * 第四个参数为排序参数,从1到10的纯数字,数值越大执行优先级越高,反之越小,默认为值为最大优先级10

       * addPlugin('cleanText','strAndStr1',array('str'=>'','str2'=>''),1);   

       * addPlugin('cleanText','strAndStr2',array('str'=>'','str2'=>''),2);  

       */  

      function addPlugin($tag,$func,$args=array(),$sort=10){  

        global $plugin_arr,$plugin_meta,$idx;  

        $plugin_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args));  

        $plugin_meta[$tag][$func][$idx]=$sort;  

      }  

      /*

       * 立即删除函数集标签中 的某个函数

       * 第一个参数为自定义函数集标签名称

       * 第二个参数为要从函数集里 删除的单个函数名称

       */  

      function removePlugin($tag,$func){  

        global $plugin_arr,$plugin_meta;  

        if(isset($plugin_meta[$tag][$func])){  

            foreach($plugin_meta[$tag][$func] as $idx=>$sort){  

                unset($plugin_arr[$tag][$sort][$idx]);  

            }  

            unset($plugin_meta[$tag][$func]);  

        }  

      }  

      /*

       * 在下次执行doPlugin时删除函数集标签中 的某个函数(在doPlugin中的插件函数执行前删除,并且删除后执行插件引擎!)

       * 第一个参数为自定义函数集标签名称

       * 第二个参数为要从函数集里 删除的单个函数名称

       */  

      function addRemovePlugin($tag,$func){  

        global $plugin_remove;  

        if(in_array($func,(array)$plugin_remove[$tag])) return ;  

        $plugin_remove[$tag][]=$func;  

      }  

      /*

       * 如下执行插件方法同上述有返回值的执行插件使用方法对应一致,

       * 唯一的区别是没有返回值

       */  

      /*

       * 执行插件引擎

       */  

      function doAction($tag,$args=array()){  

        global  $action_arr,$action_remove;  

        if(empty($action_arr[$tag])) return ;  

        if(isset($action_remove[$tag])){  

            foreach($action_remove[$tag] as $func){  

                removeAction($tag,$func);  

            }  

        }  

        krsort($action_arr[$tag]);  

        foreach($action_arr[$tag] as $action_sort){  

            foreach($action_sort as $action_idx){  

                $action_idx['args']=array_merge($action_idx['args'],$args);  

                call_user_func_array($action_idx['func'],array_slice($action_idx['args'],0,$action_idx['args_count']));  

            }  

        }  

      }  

      /*

       * 向插件引擎里添加函数

       */  

      function addAction($tag,$func,$args=array(),$sort=10){  

        global $action_arr,$action_meta,$idx;  

        $action_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args));  

        $action_meta[$tag][$func][$idx]=$sort;  

      }  

      /*

       * 从插件引擎里删除 执行的函数

       */  

      function removeAction($tag,$func){  

        global $action_arr,$action_meta;  

        if(isset($action_meta[$tag][$func])){  

            foreach($action_meta[$tag][$func] as $idx=>$sort){  

                unset($action_arr[$tag][$sort][$idx]);  

            }  

            unset($action_meta[$tag][$func]);  

        }  

      }  

      /*

       * 添加预删除函数,该函数会在下次执行插件引擎时,在函数集调用前被删除

       */  

      function addRemoveAction($tag,$func){  

        global $action_remove;  

        if(in_array($func,(array)$action_remove[$tag])) return ;  

        $action_remove[$tag][]=$func;  

      }  

      /* 摘取天上星 - 期待更深层次的扩展压缩...*/  

    ?>  




<?php

//执行例子如下

//为插件引擎准备好要用到的测试函数
function str2str2($str){
  return '<p>P标签开始 '.$str.' P标签结束<p/>';
}
function str3str3($str){
  return '<b style="color:red">b标签开始 '.$str.' b标签结束<b/>';

}

//注意:在测试三个例子时,一定要一个一个的测试,测试时请注释掉其他多余的例子,否则将无法看到插件引擎权限优先级的 实际对比效果产生异常结果!

例子一:
//str2str2函数的执行优先级小于str3str3,这里先执行str3str3($str)函数后执行str2str2($str)函数;
//实际运行流程解刨如下:
$str=str3str3('这是要像插件里所有函数传入的参数这里函数str3str3的执行优先级高于str2str2');
$str=str2str2($str);
echo $str;
/*输出结果浏览器里查看HTML源代码得到如下内容:
<p>P标签开始 <b style="color:red">b标签开始 这是要像插件里所有函数传入的参数这里函数str3str3的执行优先级高于str2str2 b标签结束<b/> P标签结束<p/>
*/
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),10);
echo doPlugin('cleanText',array('str'=>'这是要像插件里所有函数传入的参数这里函数str3str3的执行优先级高于str2str2'));
//例子二:
addPlugin('cleanText','str2str2',array('str'=>''),10);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'这是要像插件里所有函数传入的参数这里函数str2str2的执行优先级高于str3str3'));
/*运行结果HTML页面源代码如下:
<b style="color:red">b标签开始 <p>P标签开始 这是要像插件里所有函数传入的参数这里函数str2str2的执行优先级高于str3str3 P标签结束<p/> b标签结束<b/>
*/
//例子三:
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'当权限排序值大小一致时,后面的函数权限优先级要小于前面的故先添加的函数先执行,这里函数str3str3的执行优先级小于str2str2'));
/* 执行后的HTML源代码结果如下:
<b style="color:red">b标签开始 <p>P标签开始 当权限排序值大小一致时,后面的函数权限优先级要小于前面的故先添加的函数先执行,这里函数str3str3的执行优先级小于str2str2 P标签结束<p/> b标签结束<b/>

*/


//测试doAction执行插件的例子(该插件没有返回值,只执行!)
/*注,该插件为伍返回值插件,故而只用做输出 或直接执行场合,优先级同doPlugin插件优先级设置,故不详述!
function alertstr($str){
  echo "<script>alert('$str');</script>";
}
function alertstr2($str){
  echo $str.'1+2';
}
addAction('alert','alertstr',array('str'=>''),1);
addAction('alert','alertstr2',array('str'=>''),10);
doAction('alert',array('str'=>'要弹出的参数'));
//运行后的HTML源代码结果如下:

//要弹出的参数1+2<script>alert('要弹出的参数');</script>

?>




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-44749-1-1.html 上篇帖子: php5-imagick安装文档 (win2008r2 x64 apache2.2 x86 php5.4 x86) 下篇帖子: php gd 无法生成缩略图 软件编程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表