PHP反射API示例分享
本文实例为大家分享了PHP反射API--利用反射技术实现的插件系统架构,供大家参考,具体内容如下
<?php
/**
*@namePHP反射API--利用反射技术实现的插件系统架构
*/
/**
*先调用findPlugins方法获取到获取到实现了接口的类
*然后调用反射类的方法
*@param$method方法名
*@param$interfaceName接口名
*@returnarray方法名对应的返回结果
*/
functioncompute($method,$interfaceName){
$findPlugins=findPlugins($interfaceName);
$menu=array();
foreach($findPluginsas$plugin){//这里获取到实现Iplugin接口的所有的类
if($plugin->hasMethod($method)){//检查在类中特定的方法是否被定义。
$reflectionMethod=$plugin->getMethod($method);//获取类中的方法
if($reflectionMethod->isStatic()){//判断其方法是否为静态方法
$items=$reflectionMethod->invoke(null);
}else{
$pluginInstance=$plugin->newInstance();//创建类的新实例。给定参数传递给类构造函数。
$items=$reflectionMethod->invoke($pluginInstance);
}
$menu=array_merge($menu,is_array($items)?$items:[$items]);
}
}
return$menu;
}
/**
*首先从一堆已定义的类中找到实现Iplugin接口的类
*然后将其存放在数组中return
*@paramstring$interfaceName
*@returnarray$plugins
*/
functionfindPlugins($interfaceName){
$plugins=array();
//返回由已定义类的名字所组成的数组
foreach(get_declared_classes()as$class){
$reflectionClass=newReflectionClass($class);//获得class的反射对象,包括私有的属性方法
if($reflectionClass->implementsInterface($interfaceName)){//检查它是否实现了Iplugin接口
$plugins[]=$reflectionClass;//找到需要反射的类
}
}
return$plugins;
}
interfaceIplugin{
publicstaticfunctiongetName();//定义接口和静态方法
}
//实现Iplugin接口
classMycoolPuginimplementsIplugin{
publicstaticfunctiongetName(){
return'MycoolPlugin';
}
publicfunctiongetMenuItems(){//获取菜单项
returnarray(array('description'=>'MycoolPlugin','link'=>'/MyCoolPlugin'));
}
publicstaticfunctiongetArticles(){//获取文章
returnarray(array('path'=>'/MycoolPlugin','title'=>'Thisisareallycoolarticle','text'=>'xxxxxxxxx'));
}
}
$menu=compute('getMenuItems','Iplugin');
$articles=compute('getArticles','Iplugin');
print_r($menu);
echo"<hr>";
print_r($articles);
echo"<hr>";
$name=compute('getName','Iplugin');
print_r($name);
/*
newclass和newReflectionClass的区别是什么
1、new$class()实例化class对象
2、newReflectionClass($class)获得class的反射对象(包含了元数据信息)
区别:
1、new出来的class,你不能访问他的私有属性/方法,但反射可以。
2、反射返回的对象是class的元数据对象(包含class的所有属性/方法的元数据信息),但不是类本身;类似于查到了类的户口档案,但户口档案不是人!
*/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。