做PHP钩子的最佳方法

时间:2010-12-07 17:38:52

标签: php hook

我想知道在PHP应用程序中处理钩子的最佳方法是什么 - 所以我可以插入自定义或“插件”功能而无需修改代码主体。

我知道Wordpress的功能是这样的。 按照以下方式做某事真的很好:

if (file_exists('file_before'){ include('file_before'); }

print 'hello';

if (file_exists('file_after'){ include('file_after'); }

3 个答案:

答案 0 :(得分:17)

我通常在钩子方面做的事情是创建一个HookLoader类,它将存储两种类型的钩子,PRE和POST。因为PHP是一个单线程解释器,所以没有DURING这样的东西。

举个例子:

$Hooks = new HookLoader();

$Hook->Run("PRE","database_connect");
$Database->Connect();
$Hook->Run("POST","database_connect");

hook目录中的每个钩子应该是这样的名称:

name_pre_database_connect.hook.php

Hook文件的格式如下:

{name}_{type}_{event}.hook.php

这将允许您创建无限量的挂钩。

最好我将钩子类抽象和静态,你可以在实际对象中运行钩子调用,因此只要他们有Hook::run("type","event");

就可以集成新库。

答案 1 :(得分:5)

为什么不使用“Observer Pattern”呢?您可以将一个对象添加到您的身体并触发附加的分类所持有的动作。如果要对其进行优化,可以在每个Observer对象中创建一个定义执行阶段的特定方法。这可能最初会编程更多,但是提供了一个非常干净的界面,可以为您的类添加更多功能。

对于一个具体的例子,这个IBM dev article(顺便说一下它的整体价值)应该给你一个很好的印象。

答案 2 :(得分:0)

MediaWiki有自己的方法来定义方法中的钩子,以及注册要为给定执行点执行的函数的方法......

http://www.mediawiki.org/wiki/Hooks(可能是个好地方)