PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!

[php] view plaincopy

  1. <?php
  2. /**
  3. * 摘取天上星 版 插件引擎 第二版 version 2.0
  4. * By: 摘取天上星!
  5. * Emali: [email protected]
  6. * Date: 2012升级版
  7. **/
  8. $plugin_arr=array();
  9. $plugin_meta=array();
  10. $plugin_remove=array();
  11. $action_arr=array();
  12. $action_meta=array();
  13. $action_remove=array();
  14. $idx=0;
  15. /*
  16. * 执行插件引擎中捆绑的所有函数事件(函数执行顺序参加addPlugin函数添加插件时的第四个参数数字,数字越大优先级越高)
  17. * $tag 要执行的函数集插件标签名
  18. * $args 要往函数中传入的参数,依次按顺序填写,键名同addPlugin添加插件时第三个参数传入的键名、数量对应一致,键名对应的值即传入的参数值,
  19. * 该插件引擎是有返回值的插件引擎
  20. */
  21. function doPlugin($tag,$args=array()){
  22. global $plugin_arr,$plugin_remove;
  23. $first=array_search(current($args),$args);
  24. if(empty($plugin_arr[$tag])) return $args[$first];
  25. if(isset($plugin_remove[$tag])){
  26. foreach($plugin_remove[$tag] as $func){
  27. removePlugin($tag,$func);
  28. }
  29. }
  30. krsort($plugin_arr[$tag]);
  31. foreach($plugin_arr[$tag] as $plugins){
  32. foreach($plugins as $plugins){
  33. $plugins[‘args‘]=array_merge($plugins[‘args‘],$args);
  34. $args[$first]=call_user_func_array($plugins[‘func‘],array_slice($plugins[‘args‘],0,$plugins[‘args_count‘]));
  35. }
  36. }
  37. return $args[$first];
  38. }
  39. /* 第一个参数为自定义标签集名,
  40. * 第二个参数是你要向标签集里添加的函数名,
  41. * 第三个数组参数为第二个参数strAndStr1函数对应的参数集,有多少个函数参数,就需要添加多少个数组元素,
  42. 参数按照先后顺序依次填写,键值为空即可,且插件里所有函数的参数个数必须一致,一个以上的参数,可多个,
  43. 这里的传参数组只需要预写好键名即可,在调用doPlugin插件时给对应的键值传入键名对应的实际参数值即可
  44. * 第四个参数为排序参数,从1到10的纯数字,数值越大执行优先级越高,反之越小,默认为值为最大优先级10
  45. * addPlugin(‘cleanText‘,‘strAndStr1‘,array(‘str‘=>‘‘,‘str2‘=>‘‘),1);
  46. * addPlugin(‘cleanText‘,‘strAndStr2‘,array(‘str‘=>‘‘,‘str2‘=>‘‘),2);
  47. */
  48. function addPlugin($tag,$func,$args=array(),$sort=10){
  49. global $plugin_arr,$plugin_meta,$idx;
  50. $plugin_arr[$tag][$sort][++$idx]=array(‘func‘=>$func,‘args‘=>$args,‘args_count‘=>sizeof($args));
  51. $plugin_meta[$tag][$func][$idx]=$sort;
  52. }
  53. /*
  54. * 立即删除函数集标签中 的某个函数
  55. * 第一个参数为自定义函数集标签名称
  56. * 第二个参数为要从函数集里 删除的单个函数名称
  57. */
  58. function removePlugin($tag,$func){
  59. global $plugin_arr,$plugin_meta;
  60. if(isset($plugin_meta[$tag][$func])){
  61. foreach($plugin_meta[$tag][$func] as $idx=>$sort){
  62. unset($plugin_arr[$tag][$sort][$idx]);
  63. }
  64. unset($plugin_meta[$tag][$func]);
  65. }
  66. }
  67. /*
  68. * 在下次执行doPlugin时删除函数集标签中 的某个函数(在doPlugin中的插件函数执行前删除,并且删除后执行插件引擎!)
  69. * 第一个参数为自定义函数集标签名称
  70. * 第二个参数为要从函数集里 删除的单个函数名称
  71. */
  72. function addRemovePlugin($tag,$func){
  73. global $plugin_remove;
  74. if(in_array($func,(array)$plugin_remove[$tag])) return ;
  75. $plugin_remove[$tag][]=$func;
  76. }
  77. /*
  78. * 如下执行插件方法同上述有返回值的执行插件使用方法对应一致,
  79. * 唯一的区别是没有返回值
  80. */
  81. /*
  82. * 执行插件引擎
  83. */
  84. function doAction($tag,$args=array()){
  85. global  $action_arr,$action_remove;
  86. if(empty($action_arr[$tag])) return ;
  87. if(isset($action_remove[$tag])){
  88. foreach($action_remove[$tag] as $func){
  89. removeAction($tag,$func);
  90. }
  91. }
  92. krsort($action_arr[$tag]);
  93. foreach($action_arr[$tag] as $action_sort){
  94. foreach($action_sort as $action_idx){
  95. $action_idx[‘args‘]=array_merge($action_idx[‘args‘],$args);
  96. call_user_func_array($action_idx[‘func‘],array_slice($action_idx[‘args‘],0,$action_idx[‘args_count‘]));
  97. }
  98. }
  99. }
  100. /*
  101. * 向插件引擎里添加函数
  102. */
  103. function addAction($tag,$func,$args=array(),$sort=10){
  104. global $action_arr,$action_meta,$idx;
  105. $action_arr[$tag][$sort][++$idx]=array(‘func‘=>$func,‘args‘=>$args,‘args_count‘=>sizeof($args));
  106. $action_meta[$tag][$func][$idx]=$sort;
  107. }
  108. /*
  109. * 从插件引擎里删除 执行的函数
  110. */
  111. function removeAction($tag,$func){
  112. global $action_arr,$action_meta;
  113. if(isset($action_meta[$tag][$func])){
  114. foreach($action_meta[$tag][$func] as $idx=>$sort){
  115. unset($action_arr[$tag][$sort][$idx]);
  116. }
  117. unset($action_meta[$tag][$func]);
  118. }
  119. }
  120. /*
  121. * 添加预删除函数,该函数会在下次执行插件引擎时,在函数集调用前被删除
  122. */
  123. function addRemoveAction($tag,$func){
  124. global $action_remove;
  125. if(in_array($func,(array)$action_remove[$tag])) return ;
  126. $action_remove[$tag][]=$func;
  127. }
  128. /* 摘取天上星 - 期待更深层次的扩展压缩...*/
  129. ?>

<?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>

?>

时间: 2024-11-08 14:08:00

PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!的相关文章

软件编程入门自学

软件编程是目前行业里最热门的职业,也是现在人才缺口最大的职业.许多人都想转行到软件编程,在软件编程行业好好打拼,但是培训机构的学费却也是个难题,所以很多人都选择自学,想通过自学软件编程进入这行.软件编程入门自学 1. 什么是软件编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.编程分为硬件编程和软件编程. 2. 软件编程入门 学习软件编程首先要学编程语言,选择一个自己感兴趣的编程语言才是学习软件编程的首要条件.软件编程语言常见的有Java.C++.C

CUDA编程(五)关注内存的存取模式

CUDA编程(五) 关注内存的存取模式 上一篇博客我们使用Thread完成了简单的并行加速,虽然我们的程序运行速度有了50甚至上百倍的提升,但是根据内存带宽来评估的话我们的程序还远远不够, 除了通过Block继续提高线程数量来优化性能,这次想给大家先介绍一个访存方面非常重要的优化,同样可以大幅提高程序的性能~ 什么样的存取模式是高效的? 大家知道一般显卡上的内存是 DRAM,因此最有效率的存取方式,是以连续的方式存取,单纯说连续存取可能比较抽象,我们还是通过例子来看这个问题. 之前的程序,大家可

java多线程同步以及线程间通信详解&amp;消费者生产者模式&amp;死锁&amp;Thread.join()(多线程编程之二)

本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: [java] view plain copy print? package com.zejian.test; /** * @author zejian * @time 2016年3月12日 下午2:55:42 * @decrition 模拟卖票线程 */ public class Ticket implements Runnable { //当前拥有的票数 private 

去哪儿网玩乐事业部-数据模式演进

简介 一转眼在去哪儿网玩乐事业部工作快4年了,经历了数据团队的组建和发展,回顾一下整体过程,经历了很多坎坷,普通而不简单.下面是大事记 2014年(系统搭建):开发报表平台.接入HADOOP.搭建调度系统 2015年(数据集市):搭建数据集市.开发数据同步工具 2016年(数据应用):系统定价.多维分析 2017年(数据重构):重构底层.数据分级.元数据.数据质量 2018年(数据化运营):实时系统.用户画像.模型搭建 2014年(系统搭建) 2014年组建数据团队,整体结构如下: 当时迅速区理

[小北De编程手记] : Lesson 05 - Selenium For C# 之 API 下

上一篇,我们介绍了一些Selenium WebDriver相关的API,下面我们就接着上一篇继续介绍Selenium常用的API,这一篇的内容主要涉及到以下话题: Selenium API:复杂事件处理 Selenium API:特殊DOM元素处理 Selenium API:截图功能 Selenium API:关于框架扩展 (一)Selenium API:复杂事件处理 首先,我们试想一下这样的场景.待测试的系统支持一些组合键的操作,例如:按住Ctrl的同时点击某个表格的某个单元格,该数据行会高亮

【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6(0.8和0.9版本都不包含该算法.Mahout0.6可以和Hadoop2.2.0和平共处有点意外orz) 部分输入数据,输入数据一行代表一个购物篮: 4750,19394,25651,6395,5592 26180,10895,24571,23295,20578,27791,2729,8637 7

VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载

VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程     转载 #include <stdio.h>#include <stdlib.h>#include <pthread.h> void* tprocess1(void* args){       int i=1;       while(i<=10){            printf("process1:%d\n",i);

【石墨】极客编程小挑战#26:实现日期级联下拉选择框

详细内容请参见原文:http://www.gbtags.com/gb/share/5823.htm 本期挑战: 初始的html代码如下: <select name="year" id="year"> <option value="0">--</option> <option value="1999">1999</option> <option value=&qu

面向编程对象的好处及应用简单工厂模式(1-3)

面向编程对象的好处及应用简单工厂模式(1-3) 当初: 在上一个随笔之前做一个修改和拓展(继承,多态) 现在: 完善上一篇随笔-简单工厂实例 可以参考之前的面向编程对象的好处及应用紧耦合VS松耦合(继承,多态)(1-2) 添加OperationFactory运算工厂类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;