跟着辛星用PHP的反射机制来实现插件
我的博文的前一篇解说了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的反射机制来实现插件的更多相关文章
- 跟着辛星认识一下PHP的自己主动载入
作为一个框架,文件的载入机制是不能少的,那么我们应该怎么载入呢,这些PHP已经给我们想好了,所以我们仅仅须要依照规则办事就能够了,PHP中有两个函数能够完毕这个功能,第一个是__autoload,如今 ...
- 跟着辛星一起用CSS美化商品列表
说实话,近期对CSS的关注还是蛮多的,不为别的,仅仅是由于自己喜欢,感觉写CSS就像画家绘画一样,使用热情和激情去探索,没有了那份功利心,反而感觉是一种享受.特别有成就感,好啦,今天就分享一期自己用C ...
- 辛星跟您玩转vim第一节之vim的下载与三种模式
首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...
- 2014年辛星完全解读Javascript第五节 break和continue与错误处理
先说一下break和continue的主要用法吧,break用于跳出循环,continue用于跳过该循环中的一个迭代.简单的说,就是break直接从该语句跳出,但是continue不会跳出该循环语句, ...
- 2014年度辛星html教程夏季版第二节
上面一节中我们介绍了HTML文件的书写和几个标签,接下来我们来认识几个其他的标签,这里我们主要介绍一下head标签和文本标签. ***************head标签*************** ...
- 【2014】【辛星】【php】【秋季】【2】第一个php程序
<span style="font-family:KaiTi_GB2312;font-size:18px;">*******************设置server** ...
- 2014年辛星解读Javascript之DOM之冒泡和捕获
上篇博客提到了Javascript事件绑定函数的三个參数.第一个是一个event.第二个是一个function.第三个是一个布尔变量.它用于指定事件传递的顺序,分为冒泡和捕获两种方式,接下来我们将揭开 ...
- 辛星和您一起手写CSS气泡
上文中我公布了一篇手写导航条的博客,那么这一篇博客我将和大家一起手写气泡.那么什么是气泡呢?先给那些刚入门的童鞋一个截图,来更好的认识一下什么是气泡把: 这就是一个简单的气泡啦,那么它主要用来干什么呢 ...
- 辛星跟您玩转vim第四节之操作文本内容
首先值得一提的是.我的vim教程pdf版本号已经写完了.大家能够去下载,这里是csdn的下载地址:csdn下载,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http:// ...
随机推荐
- Unity 性能优化(力荐)
开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...
- 题解 P3374 【【模板】树状数组 1】
恩,这是AC的第一道树状数组呢. 本蒟蒻以前遇到RMQ问题一般都用线段树或ST表,可惜ST表不支持在线修改,而线段树代码量又太大. 如今终于找到了折中方案:树状数组!!!!代码量小,还支持修改! 树状 ...
- 【Round #36 (Div. 2 only) B】Safe Spots
[题目链接]:https://csacademy.com/contest/round-36/task/safe-spots/ [题意] 给你n个数字构成的序列; 每个位置上的数都由0和1组成; 对于每 ...
- CSU 1506 Double Shortest Paths
1506: Double Shortest Paths Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 49 Solved: 5 Description ...
- ArcGIS api for javascript——用图表显示查询结果
描述 本例展示了如何使用查询任务结果用去Google Chart API构建一个图表.当运行本例,点击一个郡县去看出现在一个无焦点的InfoWindow中的人口统计的数据的图表. 函数init创建了一 ...
- cocos2d-js导弹跟踪算法(一边追着目标移动一边旋转角度)
跟踪导弹 function(targetPosition){ // 让物体朝目标移动的方法 ; var targetPoint = targetPosition; var thisPoint = cc ...
- .NET进阶——ORM基础认识
ORM对象关系映射,对象即实体,关系即关系数据库表.ORM即实现从实体对象关系数据库数据的映射. 本质上就是将数据从一种形式转换到还有一种形式.它详细又有哪些表现呢.咱们一步步学习,一步步分析. OR ...
- CSS 相对/绝对(relative/absolute)定位与jQuery的控制显示隐藏
曾经写显示隐藏老是用jq方法控制: dom.show(); dom.hide(); 事实上这样还是有非常多缺陷的. 这是html结构: <div class="holi"&g ...
- android学习笔记二、Activity深入学习
一.创建和使用: 1.Activity是android的四大组件之一,需要继承Activity并在清单文件中进行声明才能使用.没有声明则报错. 2.启动Activity是通过Intent,有两种方式: ...
- SQL Server 多种分页查询效率
关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅. 方法1 适用于 SQL Server 任何版本 SELECT TOP 页大小 * FROM table1 ...