跟着辛星用PHP的反射机制来实现插件

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

由于我只是简单的示例,所以我写的代码并不长,而且很简单,所以,大家既然理解了上面的步骤,那么就可以直接看源代码了,其中的注释还是蛮清楚的,如果读者有什么不清楚的,可以告诉我,我会认真回复的。

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

时间: 2024-10-07 05:45:29

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

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

说实话,最近对CSS的关注还是蛮多的,不为别的,只是因为自己喜欢,感觉写CSS就像画家绘画一样,使用热情和激情去探索,没有了那份功利心,反而感觉是一种享受,特别有成就感,好啦,今天就分享一期自己用CSS美化商品列表的步骤把,不喜勿喷奥,有建议请留言. 首先看一下做好之后的效果图把: 如果读者特别不喜欢这个样式,可以点击右上角的关闭,省的自己看了心烦意乱,好,我们首先新建一个HTML文件,内容书写如下: <html> <head> <title>CSS新闻列表制作<

跟着辛星深入探讨一下PHP的反射机制

早在之前学习Java的时候,清楚的记得是学完了多线程之后学习的反射,现在在PHP中当然也有反射机制,如果童鞋你还不明白,那就需要搞明白奥,毕竟反射的功能还是蛮强大的,学习它还是很具有现实意义的. 反射从简单去理解就是我们拿到一个类,得到这个类的一些信息,比如它有哪些方法.有哪些参数等等,当然我们还可以动态的去调用它的方法等等一些功能,它的用途就是可以自动加载插件.自动生成文档等等,从而达到扩展PHP语言的作用. 几乎所有的反射类都实现了reflector接口,所有的实现类都拥有一个方法,那就是e

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

作为一个框架,文件的载入机制是不能少的,那么我们应该怎么载入呢,这些PHP已经给我们想好了,所以我们仅仅须要依照规则办事就能够了,PHP中有两个函数能够完毕这个功能,第一个是__autoload,如今已经非常少用了,取而代之的是功能更加强大的spl_autoload_register,它须要的版本号是PHP5.2.1之后的版本号,如今我们的主流版本号都是支持的,因此能够放心使用. 在曾经的PHP版本号中,我们往往须要require一堆的文件名称,比方配置文件.数据库连接文件.日志文件等等,后来我

跟着辛星认识一下PHP的自动加载

作为一个框架,文件的加载机制是不能少的,那么我们应该怎么加载呢,这些PHP已经给我们想好了,所以我们只需要按照规则办事就可以了,PHP中有两个函数可以完成这个功能,第一个是__autoload,现在已经很少用了,取而代之的是功能更加强大的spl_autoload_register,它需要的版本是PHP5.2.1之后的版本,现在我们的主流版本都是支持的,因此可以放心使用. 在以前的PHP版本中,我们往往需要require一堆的文件名,比如配置文件.数据库连接文件.日志文件等等,后来我们有了__au

跟着辛星解读PHP中json的使用

由于json是那么的重要,因此PHP自从5.2就增加了对JSON的支持,主要包括两个函数:json_encode和json_decode.众所周知,json是一种数据的存储格式,我的博文里写过json的,在我的Javascript教程中,不明白的读者可以去搜一下. 比如我们新建一个xin.json文件,存储数据如下: [{"name":"辛星","age":23},{"name":"小倩","ag

跟着辛星一起了解下PHP的函数的性能

首先声明一下,这篇文章是我的原创,但是,这些数据不是我总结出来的,大家可以搜索下"百度工程师HDK",这些数据是他提供的,我只是给一个总结,因为他那篇文章很长,我这里提炼了几点要点. 要了解函数的性能,首先要知道函数的执行流程,它首先通过scanning被转化为语言片段(tokens),然后通过parsing为简单有意义的表达式,然后compile(编译)为Opcode,最后execute(执行).因为PHP本身是用C去实现的,因此最终调用的都是C的函数,即PHP就是一个用C开发出来的

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

首先值得一提的是,我的vim教程pdf版本已经写完了,大家可以去下载,这里是csdn的下载地址:点此下载 ,如果左边的下载地址挂掉了,也可以自行在浏览器下面输入如下地址进行下载:http://download.csdn.net/detail/xinguimeng/7714213 ,当然,如果你是百度网盘的忠实用户,也可以借助于百度网盘,我也同步上传到百度网盘了,下载地址如下:百度网盘下载 ,如果地址挂了,可以在浏览器中输入:http://pan.baidu.com/s/1sj9CLXz 来下载.

辛星网站构架师笔记第三篇

下面大家跟着辛星来认识一下Nginx把,它是一个跨平台的服务器,但是它和传统的服务器不同的是,它不依赖于线程处理请求,它有自己的扩展性更强的驱动(异步)架构,因此它更加适合在高流量的网站.而且它还可以作为一个负载均衡器,它可以在内部直接支持Rails和PHP程序的,而且它也可以作为一个HTTP代理服务器对外进行服务.Nginx使用C语言写成. 我们上一节介绍了LVS,那么两者的区别是什么呢?第一点就是因为lvs的工作方式简单,它只是负责请求的分发,而且工作在网络的第四层,因此其负载能力强,不会产

辛星解读mysql中的MyISAM引擎

很多以前的教科书上都是写的MyISAM是mysql的默认存储引擎,其实自从mysql5.5开始,默认存储引擎就已经改变成为InnoDB了,由于InnoDB在很多方面有着不可替代的功能,因此,很多人喜欢研究InnoDB也在情理之中,我也很喜欢InnoDB.但是呢,对于MyISAM,就跟着辛星辛博士来认识一下吧. 第一点就是MyISAM不支持事务和外键,也正是基于这一点,很多人不喜欢MyISAM.但是MyISAM并不着急改变自己,因为这个引擎的重心是性能,而不是功能,不可否认,MyISAM的性能是非