我的博文的前一篇解说了PHP的反射机制是怎么回事,假设读者还不清楚反射机制,能够搜索下或者看我的博文,都是不错的选择。我们開始解说一下怎么用PHP来实现插件机制。所谓插件机制。就是我们定义一个接口。即我们定义一个interface,然后第三方插件就去实现这个interface,然后我们拿到了这个插件之后,去调用这个插件的功能,我们能够不知道这些插件的类名等信息,我们接下来就用反射机制去实现这个功能。

因为我仅仅是简单的演示样例。所以我写的代码并不长,并且非常easy,所以,大家既然理解了上面的步骤,那么就能够直接看源码了,当中的凝视还是蛮清楚的。假设读者有什么不清楚的,能够告诉我,我会认真回复的。

<?

php
/**
*我们定义好一个接口。叫做Ixin
*/
interface Ixin{
function msg();
} /**
*某热心开发者给我们写了一个插件类
*/
class Xin implements Ixin{
function msg(){
echo "辛星你好";
}
} /**
*我们先搜索该插件类。而且推断它是否实现了msg方法
*/
function find(){
//定义描写叙述插件的数组
$plugin = array();
foreach (get_declared_classes() as $class) {
//实例化反射类的类
$reclass = new ReflectionClass($class);
//推断它是否实现了接口Ixin
if($reclass->implementsInterface('Ixin')){
$plugin[] = $reclass;
}
}
return $plugin;
} /**
*我们去调用该插件的msg方法
*/
function myexec(){
$arr = find();
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);
}
}
}
} /**
*我们仅仅须要调用这一个函数就能够了
*它自己主动搜索全部的插件,而且运行插件的msg函数
*/
myexec();

我还是分析一下吧,接口Ixin是我们定义的接口。而类Xin是第三方的插件,我们用find自己主动搜索了全部定义的类,然后我们推断这些类里面谁继承自Ixin,而且实现了msg方法,我们拿到了这个列表自后,就能够用myexec方法去调用它们了。

思路清晰吗?清晰请打1.。

。。O(∩_∩)O~

跟着辛星用PHP的反射机制来实现插件的更多相关文章

  1. 跟着辛星认识一下PHP的自己主动载入

    作为一个框架,文件的载入机制是不能少的,那么我们应该怎么载入呢,这些PHP已经给我们想好了,所以我们仅仅须要依照规则办事就能够了,PHP中有两个函数能够完毕这个功能,第一个是__autoload,如今 ...

  2. 跟着辛星一起用CSS美化商品列表

    说实话,近期对CSS的关注还是蛮多的,不为别的,仅仅是由于自己喜欢,感觉写CSS就像画家绘画一样,使用热情和激情去探索,没有了那份功利心,反而感觉是一种享受.特别有成就感,好啦,今天就分享一期自己用C ...

  3. 辛星跟您玩转vim第一节之vim的下载与三种模式

    首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...

  4. 2014年辛星完全解读Javascript第五节 break和continue与错误处理

    先说一下break和continue的主要用法吧,break用于跳出循环,continue用于跳过该循环中的一个迭代.简单的说,就是break直接从该语句跳出,但是continue不会跳出该循环语句, ...

  5. 2014年度辛星html教程夏季版第二节

    上面一节中我们介绍了HTML文件的书写和几个标签,接下来我们来认识几个其他的标签,这里我们主要介绍一下head标签和文本标签. ***************head标签*************** ...

  6. 【2014】【辛星】【php】【秋季】【2】第一个php程序

    <span style="font-family:KaiTi_GB2312;font-size:18px;">*******************设置server** ...

  7. 2014年辛星解读Javascript之DOM之冒泡和捕获

    上篇博客提到了Javascript事件绑定函数的三个參数.第一个是一个event.第二个是一个function.第三个是一个布尔变量.它用于指定事件传递的顺序,分为冒泡和捕获两种方式,接下来我们将揭开 ...

  8. 辛星和您一起手写CSS气泡

    上文中我公布了一篇手写导航条的博客,那么这一篇博客我将和大家一起手写气泡.那么什么是气泡呢?先给那些刚入门的童鞋一个截图,来更好的认识一下什么是气泡把: 这就是一个简单的气泡啦,那么它主要用来干什么呢 ...

  9. 辛星跟您玩转vim第四节之操作文本内容

    首先值得一提的是.我的vim教程pdf版本号已经写完了.大家能够去下载,这里是csdn的下载地址:csdn下载,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http:// ...

随机推荐

  1. POJ 1258 Agri-Net (最小生成树+Prim)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39820   Accepted: 16192 Descri ...

  2. KVM硬件辅助虚拟化之 EPT in Nested Virtualization

    在嵌套虚拟环境(Nested Virtualization)下,执行在hypervisor上的Virtual Machine仍能够作为hypervisor去执行其他的Virutal Machine,而 ...

  3. UITextField监控文字变化方法

    项目里须要在不隐藏键盘的情况下.来更改button 的状态. 这里就是要对uitextfield监控.uitextfield继承于UIControl.所以能够 使用addTarget方法.详细例如以下 ...

  4. thinkphp路由的作用

    thinkphp路由的作用 问题 请问一下什么是thinkPHP路由,路由有什么作用?谢谢 解答 网络访问地址从来都是映射访问的,最初是这样,主机名(电脑名称)=>ip地址(如局域网192.16 ...

  5. Hadoop的单节点集群详细启动步骤

    见,如下博客 hadoop-2.2.0.tar.gz的伪分布集群环境搭建(单节点) 很简单,不多赘述.

  6. CORS with Spring MVC--转

    原文地址:http://dontpanic.42.nl/2015/04/cors-with-spring-mvc.html CORS with Spring MVC   In this blog po ...

  7. 清空/var/adm/wtmp 文件内容

    清/var/adm/wtmp 文件内容 用于显示登录系统和重启机器的情况 /var/adm/wtmp文件过大. 可用du -sm /var/adm/wtmp查看 cat /dev/null>/v ...

  8. 浅述html5和web app

    题外话:最近跟不少产品解释技术术语,比如脚本.数据库.H5等等,我一般会把他们当成稍微了解这些技术的人,用专业的语言描述一遍,然后用通俗的语言解释一遍,最后举例子解释一遍. 肯定有人问,你把流程反过来 ...

  9. Js 中的i++ 和 ++i 的区别

    首先碰见  i++ 和 ++i 会一脸蒙蔽 感觉没什么区别,都是相加  , 但是  输出的值是不同!!! 来奉上代码来进行比较 var i = 1; var a = i++; //a = 1; 此时i ...

  10. LRJ入门经典-0903切蛋糕305

    原题 LRJ入门经典-0903切蛋糕305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 如图所示有一个矩形蛋糕,上面划分成 ...