标准插件类

该文章介绍了一个简单的PHP插件扩展系统,通过设置钩子和自动加载机制,允许开发者在项目中插入自定义功能。插件通过实现特定接口并放置在指定目录下,系统能自动加载并执行相应方法。用户需按照步骤配置文件路径、注册钩子和创建插件类文件来使用此系统。
摘要由CSDN通过智能技术生成

最近因为一个小项目需要扩展功能,实现了一个简单的插件扩展;

使用方法:

1、将下面文件放在项目文件夹中

2、在合适的位置引用插件文件,根据需要修改代码中插件的目录位置  $pluginsDirectory = dirname(__FILE__) . '/../plugins';

3、在系统中各个位置设置钩子,例如 <?php Hook::event('execute','a');?> 

        其中“execute” 是钩子名称,也是调用的插件中的方法名,a是参数

4、在plugins目录中创建一个类 文件名正常写,例如:“header.php” 类名称前必须加“Plugin_”前缀;例如:

<?php
class Plugin_Header implements PluginInterface
{
    public function execute($val = '1')
    {
        echo "你好,这是插件{$val};";
    }
}

5、刷新页面看看是否可以调用了呀

插件文件代码如下:

<?php
// 钩子类
class Hook
{
    static public $plugins = array();

    static public function register(PluginInterface $plugin)
    {
        static::$plugins[] = $plugin;
    }

    static public function event($hookName = '',...$val)
    {
        if ($hookName == '') {
            return false;
        }
        foreach (static::$plugins as $plugin) {
            if (method_exists($plugin, $hookName)) {
                call_user_func(array($plugin, $hookName),...$val);
            }
        }
    }
}
/**
 * 插件接口
 */
interface PluginInterface
{
}
$pluginsDirectory = dirname(__FILE__) . '/../plugins';

// 自动加载插件类
spl_autoload_register(function ($className) use ($pluginsDirectory) {

    if (strpos($className, 'Plugin_') === 0) {
        $fileName = str_replace('_', '/', substr($className, 7)) . '.php';

        $fileName = $pluginsDirectory . DIRECTORY_SEPARATOR . $fileName;
        // var_dump(file_exists($fileName));
        require_once $fileName;
    }
});

// 注册plugins目录内的所有 PHP 文件为插件
function registerPlugins($directory)
{

    if (!is_dir($directory)) {
        return false;
    }
    $files = scandir($directory);
    foreach ($files as $file) {
        $filePath = $directory . '/' . $file;
        if (is_file($filePath) && pathinfo($filePath, PATHINFO_EXTENSION) === 'php') {
            $className = 'Plugin_' . pathinfo($file, PATHINFO_FILENAME);

            if (class_exists($className)) {

                $plugin = new $className();

                if ($plugin instanceof PluginInterface) {

                    Hook::register($plugin);
                } else {
                    var_dump($className . '不存在!');
                    die;
                }
            } else {
                var_dump($className . '不存在');
                die;
            }
        }
    }
}

//注册插件
registerPlugins($pluginsDirectory);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值