网盘搜索插件php源码,查找插件

这篇博客探讨了如何利用PHP的反射API来查找并执行实现了特定接口的类的方法,如`IPlugin`接口。通过反射,可以动态地获取类的信息,包括其属性、方法,并调用非静态方法。示例展示了如何构建一个动态菜单、侧边栏和文章列表,这些都来源于实现了`IPlugin`接口的类。
摘要由CSDN通过智能技术生成

~~~

echo '

';

//定义一个测试反射的类

class CQH

{

public $name = 'cqh';

private $country= 'china';

const gender = 'man';

public function say()

{

echo 'hello,world';

}

private function eat()

{

echo 'eat';

}

public static function drink()

{

echo 'drink';

}

}

/* //打印所有的反射接口

Reflection::export(new ReflectionExtension('reflection')); */

/* //反射创建所有的PHP类的导出结果,get_declared_classes可以获取所有已声明的类

foreach(get_declared_classes() as $class)

{

Reflection::export(new ReflectionClass($class));

} */

/* //只反射用户自己定义的类

foreach(get_declared_classes() as $class)

{

$reflectionClass = new ReflectionClass($class);

if($reflectionClass->isUserDefined())

{

Reflection::export($reflectionClass);

}

} */

/********************************使用反射查找插件********************************/

//定义一个接口

interface IPlugin

{

public static function getName();

}

//查到所有实现了IPlugin接口的类

function findPlugins()

{

$plugins = array();

foreach(get_declared_classes() as $class)

{

$reflectionClass = new ReflectionClass($class);

if($reflectionClass->implementsInterface('IPlugin'))

{

$plugins[] = $reflectionClass;

}

}

return $plugins;

}

//确定用于菜单的类的成员

function computeMenu()

{

$menu = array();

foreach(findPlugins() as $plugins)

{

$reflectionMethod = $plugins->getMethod('getMenuItems');

if($reflectionMethod->isStatic())

{

$items = $reflectionMethod->invoke(null);

}

else

{

//如果这个方法不是静态的,我们需要一个实例

$pluginsInstance = $plugins->newInstance();

$items = $reflectionMethod->invoke($pluginsInstance);

}

$menu = array_merge($menu,$items);

}

return $menu;

}

//确定用于文章的侧边栏的类的成员

function computeArticles()

{

$articles = array();

foreach(findPlugins() as $plugin)

{

if($plugin->hasMethod('getArticles'))

{

$reflectionMethod = $plugin->getMethod('getArticles');

if($reflectionMethod->isStatic())

{

$items = $reflectionMethod->invoke(null);

}

else

{

$pluginInstance = $plugin->newInstance();

$items = $reflectionMethod->invoke($pluginInstance);

}

$articles = array_merge($articles,$items);

}

}

return $articles;

}

//确定侧边栏的的类的成员

function computeSidebars()

{

$sidebars = array();

foreach(findPlugins() as $plugin)

{

if($plugin->hasMethod('getSidebars'))

{

$reflectionMethod = $plugin->getMethod('getSidebars');

if($reflectionMethod->isStatic())

{

$items = $reflectionMethod->invoke(null);

}

else

{

$pluginInstance = $plugin->newInstance();

$items = $reflectionMethod->invoke($pluginInstance);

}

$sidebars = array_merge($sidebars,$items);

}

}

return $sidebars;

}

//创建一个实现了Iplugin接口的类

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...'

));

}

}

$menu = computeMenu();

$sidebars = computeSidebars();

$articles = computeArticles();

print_r($menu);

print_r($sidebars);

print_r($articles);

echo '

';

?>

~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值