Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何构建一个简单的php钩子系统,它可以像这样工作?_Php - Fatal编程技术网

我如何构建一个简单的php钩子系统,它可以像这样工作?

我如何构建一个简单的php钩子系统,它可以像这样工作?,php,Php,我正试图找到一种方法来构建一个与Drupal使用的钩子系统非常相似的钩子系统。使用Drupal,您可以简单地以某种方式命名函数,如果模块启用,它将自动作为钩子调用 我在这里查看了Stackoverflow的其他答案,但没有一个真正给出如何将此类功能构建到PHP应用程序中的答案。我不熟悉Drupal的内部结构,但它可能使用反射: 您可以包括包含钩子函数的PHP页面,然后使用反射查找符合特定命名约定的函数或类方法,然后保存函数指针以在适当时调用这些函数(例如模块生命周期中的事件)。您可以使用PHP

我正试图找到一种方法来构建一个与Drupal使用的钩子系统非常相似的钩子系统。使用Drupal,您可以简单地以某种方式命名函数,如果模块启用,它将自动作为钩子调用


我在这里查看了Stackoverflow的其他答案,但没有一个真正给出如何将此类功能构建到PHP应用程序中的答案。

我不熟悉Drupal的内部结构,但它可能使用反射:

您可以包括包含钩子函数的PHP页面,然后使用反射查找符合特定命名约定的函数或类方法,然后保存函数指针以在适当时调用这些函数(例如模块生命周期中的事件)。

您可以使用PHP获取函数名字符串数组,然后按预定义的格式过滤这些名称

此示例来自PHP文档:

<?php
function myrow($id, $data)
{
    return "<tr><th>$id</th><td>$data</td></tr>\n";
}

$arr = get_defined_functions();

print_r($arr);
?>

与更显式的钩子系统相比,这是一种粗略的技术,但它是有效的。

drupal就是这样做的,您也可以这样做。 使用具有名称约定的字符串连接。 使用函数_exists()并调用_user_func_array()时,您应该都已设置好

下面是两个内部drupal函数,它们实现了这个技巧(module.inc)

因此,您只需要调用

module_invoke('ModuleName','HookName', $arg1, $arg2, $arg3);
最终会打电话给谁

ModuleName_HookName($arg1,$arg2,$arg3);

为什么不使用现有的函数呢?开发者可以用某种方式命名函数,钩子代码只需检查它是否存在,然后调用它们

查看Drupal并对其进行反向工程?@Paul我实际上一直在这样做,但Drupal的功能比我实际需要的要多,而且还不清楚到底是什么在处理钩子系统。+1。还有一个补充说明:你也可以用它来补充这个。事实上,我认为在一个干净的设计中,你只会使用面向方面的编程,而不会使用“定义函数”这一技巧,但我认为OP没有那么先进。然而,对于其他读者来说,这是一个很好的了解。你至少需要一个VPS来使用它,因为AOP扩展不是标准发行版的一部分。我不知道为什么你被修改了,我也是-所以我给了你一个向上的投票。我正在阅读你提供的页面,不确定为什么有人会在不留下评论的情况下否决你。谢谢
module_invoke('ModuleName','HookName', $arg1, $arg2, $arg3);
ModuleName_HookName($arg1,$arg2,$arg3);