获取php文件中任意插件的实例

获取php文件中任意插件的实例,php,class,Php,Class,这个名字很糟糕,但我真的不知道还能叫它什么 我正在尝试为我的网站制作一个可扩展的模块化插件系统。我需要能够访问插件目录中存在的插件php文件,并访问它们的类来调用函数,例如获取插件应该显示的html内容等等 下面是我试图实现的一个半伪代码示例,但如何实际任意加载插件是我遇到的难题(PluginLoader.php) -马克斯 //BasePlugin.php 抽象类BasePlugin { 公共函数displayContent() { 打印“基本插件””; } }; //ExamplePlugi

这个名字很糟糕,但我真的不知道还能叫它什么

我正在尝试为我的网站制作一个可扩展的模块化插件系统。我需要能够访问插件目录中存在的插件php文件,并访问它们的类来调用函数,例如获取插件应该显示的html内容等等

下面是我试图实现的一个半伪代码示例,但如何实际任意加载插件是我遇到的难题(PluginLoader.php)

-马克斯

//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() ;
}