PHP中使用反射技术的模式插件使用说明
API插件方法的反射是根据运行程序的功能来决定的,也就是说,它允许接口方法创建可选的,并检测接口方法的第一次,只有在插件的情况下,这部分接口,他们将被使用。假设有这样的接口
复制代码代码如下所示:
接口插件{
getmenuitems()函数;
getarticles()函数;
getsidebars()函数;
}
类someplugin implelents插件{
公共功能getmenuitems(){
没有菜单项
返回null;
}
公共功能(getarticles){ / /没有文章
返回null;
}
公共功能getsidbars(){
侧
返回的数组(sidbaritem);
}
}
{ HTML }
这种情况是不太合理的,因为它满足接口的要求,并添加了不用于大量方法的函数。如果API中有数百种方法,它将不能工作。
反射API提供了一个解决方案,让学生利用get_declared_classes加载(目前)功能,并检测这类实现方法的插件标记。
这里有一种使用反射来查找插件的方法
{代码}
功能findplugins(){
插件=数组();
foreach(get_declared_classes()达类){
reflectionsclass =新reflectionclass美元(合班);
如果($ reflectionsclass -> implementsinterface('iplugin ')){
{ } = reflectionsclass美元美元的插件;
}
}
返回$插件;
}
为了确定一个单一的方法已实施的hasmethod类,()的refectionclass类的方法可以用。
确定菜单中使用的类的成员。
复制代码代码如下所示:
功能computermenu(){
菜单=数组();
foreach(findplugins()达插件){
如果($插件-> hasmethod('getmenuitems ')){
反射波法=美元美元插件-> getMethod('getmenuitems);
如果($反射->静态()){
美元美元的项目=反射->调用(空);
其他{ }
plugininstance美元=美元插件-> newInstance();
美元美元的项目=反射->调用($ plugininstance);
}
美元($菜单,菜单= array_merge美元项目);
}
}
返回$菜单;
}
当获取类的实例时,需要检测API方法是否可以称为静态检测,如果该方法是静态的,则只调用调用()函数。
如下:(stdClass对象调用公共混合,混合参数= null)
另一方面,如果方法不是一成不变的,它需要插件实例调用此方法,并从refectionclass对象类的一个实例。
调用它的newInstance()方法,然后使用Invoke()方法返回的实例,并通过。
确定用于文章和侧的类的成员。
复制代码代码如下所示:
功能computearticles(){
$ =数组();
foreach(findplugins()达插件){
如果($插件-> hasmethod('getarticles ')){
反射波法=美元美元插件-> getMethod('getarticles);
如果($反射->静态()){
美元美元的项目=反射->调用(空);
其他{ }
plugininstance美元=美元插件-> newInstance();
美元美元的项目=反射->调用($ plugininstance);
}
文章array_merge美元=(美元的文章,美元的项目);
}
}
退回物品;
}
功能computesidebars(){
侧边栏=阵列(美元);
foreach(findplugins()达插件){
如果($插件-> hasmethod('getsidebars ')){
$reflectionMethod=$plugin->getMethod ('getSidebars');
如果($反射->静态()){
美元美元的项目=反射->调用(空);
其他{ }
plugininstance美元=美元插件-> newInstance();
美元美元的项目=反射->调用($ plugininstance);
}
美元($侧边栏,侧边栏= array_merge美元项目);
}
}
返回的侧边栏;
}
创建一个实现可选特性的反射插件
复制代码代码如下所示:
类mycoolplugin实现插件{
公共静态函数getName(){ return'mycoolplugin;}
公共静态函数getmenuitems(){
菜单项的数字索引数组
返回的数组(array('description= > 'mycoolplugin ','link= > / mycoolplugin '));
}
公共静态函数getarticles(){
数字/索引数组
返回数组(数组('path= > / mycoolplugin,标题= >这是一个很酷的文章,
文本,这篇文章很酷因为= >…
}
公共静态函数getsidebars(){
侧边栏索引数组
返回的数组(array('sidebars= > / mycoolplugin '));
}
}
最后,只要可以使用,就可以使用这种插件。
复制代码代码如下所示:
菜单= computearticles(美元);
侧边栏= computesidebars(美元);
文章computearticles美元=();
print_r(美元菜单);
print_r($边栏);
print_r(合篇);