获取php文件中任意插件的实例
这个名字很糟糕,但我真的不知道还能叫它什么 我正在尝试为我的网站制作一个可扩展的模块化插件系统。我需要能够访问插件目录中存在的插件php文件,并访问它们的类来调用函数,例如获取插件应该显示的html内容等等 下面是我试图实现的一个半伪代码示例,但如何实际任意加载插件是我遇到的难题(PluginLoader.php) -马克斯获取php文件中任意插件的实例,php,class,Php,Class,这个名字很糟糕,但我真的不知道还能叫它什么 我正在尝试为我的网站制作一个可扩展的模块化插件系统。我需要能够访问插件目录中存在的插件php文件,并访问它们的类来调用函数,例如获取插件应该显示的html内容等等 下面是我试图实现的一个半伪代码示例,但如何实际任意加载插件是我遇到的难题(PluginLoader.php) -马克斯 //BasePlugin.php 抽象类BasePlugin { 公共函数displayContent() { 打印“基本插件””; } }; //ExamplePlugi
//BasePlugin.php
抽象类BasePlugin
{
公共函数displayContent()
{
打印“基本插件””;
}
};
//ExamplePlugin.php->位于特定插件目录中。
需要('../BasePlugin.php');
类ExamplePlugin扩展了BasePlugin
{
公共静态函数实例()
{
静态$inst=null;
如果($inst==null){
$inst=新示例插件();
}
返回$inst;
}
公共函数displayContent()
{
打印“示例插件””;
}
}
//PluginLoader.php
foreach($pluginFile:pluginfesindirectory){//在plugin目录中迭代plugin php文件
$plugin=GetPlugin($pluginFile);//以某种方式获取插件实例。
echo插件->显示内容();
}
我在这里猜测,但在我看来,您需要:
- 获取所需目录中的插件列表
- 包括或要求插件的类文件
- 创建类的实例
- 调用插件的displayContent()方法
$pluginDir = 'your/plugin/directory/' ;
$plugins = glob($pluginDir . '*.php') ;
foreach($plugins as $plugin) {
// include the plugin file
include_once($plugin) ;
// grab the class name from the plugin's file name
// this finds the last occurrence of a '/' and gets the file name without the .php
$className = substr($plugin,strrpos($plugin,'/') + 1, -4) ;
// create the instance and display your test
$aPlugin = $className::Instance() ;
$aPlugin->displayContent() ;
}
可能有一种更简洁的方法可以做到这一点,但这将准备好您的目录,获取插件的代码,并实例化每个插件。之后如何管理/引用它们取决于插件如何在应用程序中注册 这似乎是一个有效的解决方案,但我想知道是否有更好的方法来做到这一点。没想到这个,谢谢你的回复!我确信有一种更奇特的方法可以遍历目录并使用迭代器,但这是可行的。如果插件目录中的插件文件不止这些,那么需要为glob()使用不同的字符串。glob()的正则表达式功能不是您所期望的,因此请始终注意glob()字符串中的正则表达式。我不是指遍历目录,我想知道这是否是加载插件的唯一方法。似乎已经足够了。@MaxKunes,要加载php文件,您需要使用require\u once()或include\u once()。主要区别如下所示(来自php.net):“require与include相同,除非失败,否则它还将产生致命的E_COMPILE_错误级别错误。换句话说,它将停止脚本,而include只发出警告(E_警告),允许脚本继续。”
$pluginDir = 'your/plugin/directory/' ;
$plugins = glob($pluginDir . '*.php') ;
foreach($plugins as $plugin) {
// include the plugin file
include_once($plugin) ;
// grab the class name from the plugin's file name
// this finds the last occurrence of a '/' and gets the file name without the .php
$className = substr($plugin,strrpos($plugin,'/') + 1, -4) ;
// create the instance and display your test
$aPlugin = $className::Instance() ;
$aPlugin->displayContent() ;
}