<?php
//利用反射机制,简单的实现PHP插件模式
# 假设,我们有一款开源产品,所有开发者都必须在我定制的需求之上,进行二次开发,
# 而开发完成后的新模块,就是一个不一样的新插件,可以放在特定的位置进行自动加载 #这是我们的开源产品
interface Demo{
# 所有插件都必须实现这个方法
public function msg();
} #这是小明开发的插件-1
class xiaoming implements Demo{
public function msg(){
echo '小明:我就静静地看着你装逼<br/>';
}
} #这是小李开发的插件-2
class xiaoli implements Demo{
public function msg(){
echo '小李:我就装逼了,你能拿我咋滴?<br/>';
}
} #我们先搜索该插件类,并且判断它是否实现了msg方法
function find(){
# 定义描述插件的数组(是一个实例)
$plugin = array(); foreach (get_declared_classes() as $class) {
$reclass = new ReflectionClass($class); # 检测类是否继承与接口Demo
if ($reclass->implementsInterface('Demo')) {
$plugin[] = $reclass;
}
}
return $plugin;
} /**
* 编写一个监听所有插件对应的msg方法 的函数
*/
function myexec(){
foreach (find() as $plugin) {
# 判断该插件是否拥有msg方法
if($plugin->hasMethod('msg')){
# 得到这个方法类的一个实例
$remethod = $plugin->getMethod('msg');
# 如果它是静态方法,则直接调用即可
if($remethod->isStatic()){
$remethod->invoke(null);
}else{
# 先声明插件类的一个实例,然后调用它
$pluins = $plugin->newInstance();
$remethod->invoke($pluins);
}
}
}
} # 监听所有插件
myexec();
?>

最新文章

  1. DevExpress Ribbon右上角button显示文本设置
  2. python基础 Day01 练习题
  3. windbg符号
  4. PL/SQL Developer使用技巧、快捷键
  5. cocos2d-x教程2:在windows下怎样批量转换pvr,ccz为png或jpg
  6. 理解的javascript自定义事件
  7. 【转】ATA Secure Erase
  8. Nginx配置了解
  9. Linux 技巧:让进程在后台可靠运行的几种方法【转】
  10. 库zlog的使用手册
  11. git 误删分支恢复方法
  12. Semver(语义化版本号)扫盲
  13. ltp-ddt的makefile结构
  14. ubuntu 使用命令行登录oracle
  15. SO\PR\MO\排产回写的数据如下
  16. LRU ,LRUW,CKPT-Q
  17. 【题解】 [ZJOI2009]假期的宿舍 (二分图匹配)
  18. 5. 支持向量机(SVM)软间隔
  19. linux中与Oracle有关的内核参数详解
  20. kvm_read_guest*函数分析

热门文章

  1. IOS 错误原因
  2. python 中的富文本编译器
  3. 十 Restful风格
  4. node属性
  5. CH12 动态内存
  6. 使用Spring Cloud Gateway保护反应式微服务(一)
  7. 模拟实现ES6的set类
  8. 第1节 IMPALA:6、yum源制作过程
  9. mysql 命令行导入导出.sql文件
  10. uboot前传