反射API的插件方法是基于在运行时决定程序的功能来实现的,也就是说,它允许创建可选的接口方法,并在首次使用时检测到这部分接口方法,只有在插件中存在这部分接口的情况下,它们才会被用到. 假设拥有这样的接口 复制代码 代码如下: interface IPlugin{ function getMenuItems(); function getArticles(); function getSideBars(); } class Someplugin implelents IPlugin{ public function getMenuItems(){ //没有菜单项 return null; } public function getArticles(){ //没有任何文章 return null; } public function getSidBars(){ //有侧边 return array("sidbarItem"); } } [html] 这种情况并不太合理,因为满足了接口的要求,为大量方法添加了不会用到的函数体,如果在API中有数百个方法,这样是行不通的。 反射API提供了一种解决方法,使用get_declared_classes()函数取得当前加载的类,并检测哪个类实现了IPlugin"标记"的方法。 在这里写了一个使用反射查找插件的方法 [code] function findPlugins(){ $plugins=array(); foreach (get_declared_classes() as $class){ $reflectionsClass=new ReflectionClass($class); if($reflectionsClass->implementsInterface("IPlugin")){ $plugins[]=$reflectionsClass; } } return $plugins; }
创建一个实现了可选特性的反射式插件 复制代码 代码如下: class MyCoolPlugin implements IPlugin{ public static function getName(){return "MyCoolPlugin";} public static function getMenuItems(){ //菜单项的数字索引数组 return array(array("description"=>"MyCoolPlugin","link"=>"/MyCoolPlugin")); } public static function getArticles(){ //文章的数字索引数组 return array(array("path"=>"/MyCoolPlugin","title"=>"This is a really cool article", "text"=>"This article is cool because...")); } public static function getSideBars(){ //文章的侧边栏索引数组 return array(array("sideBars"=>"/MyCoolPlugin")); } }