我正在用PHP启动一个新的web应用程序,这次我想创建一些人们可以通过使用插件接口来扩展的东西.

如何在代码中编写"钩子",以便插件可以附加到特定事件?

推荐答案

你可以使用观察者模式.实现这一点的一种简单功能方法:

<?php

/** Plugin system **/

$listeners = array();

/* Create an entry point for plugins */
function hook() {
    global $listeners;

    $num_args = func_num_args();
    $args = func_get_args();

    if($num_args < 2)
        trigger_error("Insufficient arguments", E_USER_ERROR);

    // Hook name should always be first argument
    $hook_name = array_shift($args);

    if(!isset($listeners[$hook_name]))
        return; // No plugins have registered this hook

    foreach($listeners[$hook_name] as $func) {
        $args = $func($args); 
    }
    return $args;
}

/* Attach a function to a hook */
function add_listener($hook, $function_name) {
    global $listeners;
    $listeners[$hook][] = $function_name;
}

/////////////////////////

/** Sample Plugin **/
add_listener('a_b', 'my_plugin_func1');
add_listener('str', 'my_plugin_func2');

function my_plugin_func1($args) {
    return array(4, 5);
}

function my_plugin_func2($args) {
    return str_replace('sample', 'CRAZY', $args[0]);
}

/////////////////////////

/** Sample Application **/

$a = 1;
$b = 2;

list($a, $b) = hook('a_b', $a, $b);

$str  = "This is my sample application\n";
$str .= "$a + $b = ".($a+$b)."\n";
$str .= "$a * $b = ".($a*$b)."\n";

$str = hook('str', $str);
echo $str;
?>

Output:

This is my CRAZY application
4 + 5 = 9
4 * 5 = 20

Notes:

对于这个示例源代码,您必须在想要扩展的实际源代码之前声明所有插件.我已经包括了一个如何处理传递给插件的单个或多个值的示例.最困难的部分是编写实际的文档,其中列出了传递给每个钩子的参数.

这只是用PHP实现插件系统的一种方法.还有更好的 Select ,我建议你查看WordPress文档以了解更多信息.

Php相关问答推荐

将一个数字分配到一系列因素中(就像贪婪算法)

以编程方式更新现有Yith WooCommerce Booking的状态

从含有特殊字符的ANSI文本文件中读取数据是在移值,为什么?

如何减少Laravel分页中的链接数

在WooCommerce中禁用特定日期之前的免费送货

Laveel Livewire Get Groupby姓名列表

有没有可能从composer 过时的输出中隐藏不需要的主要版本?

Apache只允许index.php-不从根目录工作

Laravel服务Provider 没有向服务类注入价值

对表示大小的值后缀进行自定义排序(XXS、XS、S、M、L、XL、XXL)

调用模型[App\Models\Employee]上未定义的关系[title]

在 PHP 中将字符串分解为数组(字符串类似于 WP 短代码)

在php中计算两个没有假期的日期之间的小时差

在 vue 自定义渲染器中访问变量

根据WooCommerce中的产品重量更改简单产品的输入数量步值

自定义主键值未正确显示

如何修复正则表达式以在换行符后查找非数值

php var_dump(1) 返回字符串(4)

我需要获取传递到这个数组中的数据,但我没有得到它,因为在 Laravel 中数组是这样出现的

为什么非贪婪匹配会消耗整个模式,即使后面跟着另一个非贪婪匹配