我已经试过用谷歌搜索如何做到这一点,但我仍然搞不清楚。如何在PHP中创建一个简单的钩子?以下是我迄今为止所尝试的:
wrapper.php(应用程序从这里开始)
<?php require 'core.php'; ?>
<?php require 'view.php'; ?>
core.php
<?php
$hooks['hook_head'] = array();
//supposed to insert action in $hooks
function addHook($hookName, $funct){
global $hooks;
array_push($hooks[$hookName], $funct);
}
//supposed to execute specific hook
function executeHook($hookname){
global $hooks;
foreach($hooks[$hookname] as $funct){
call_user_func( $funct );
}
}
//supposed to execute action in $hooks when array key = hook_head
function hook_head(){
global $hooks;
if (array_key_exists('hook_head', $hooks)) {
executeHook( 'hook_head' );
}
}
//supposed to execute action in $hooks when array key == hook_footer
function hook_footer(){
global $hooks;
if (array_key_exists('hook_footer', $hooks)) {
executeHook( 'hook_footer' );
}
}
?>
view.php
<!DOCTYPE HTML>
<html>
<head>
<?php hook_head(); ?>
</head>
<body>
<hr />
<?php
//add action to hook start here
$test = function(){ echo "test succeds"; };
addHook('hook_head', $test);
?>
<?php hook_footer(); ?>
</body>
</html>
如果在调用hook_head()
之前,在$hooks['hook_head']
中插入一个操作,代码就可以正常工作。不过,我实际上想做的是在调用hook_head()
之后插入操作。我该怎么做?
将addHook
调用移动到hook_head
调用之前(最好移动到文件的开头)。
我确实注意到您"想在调用hook_head()之后开始编码(在hookhead中插入操作)",但这非常麻烦。它看起来像这样:
- 更改
hook_head()
以在输出中插入某种令牌 - 在脚本的末尾,
- 调用
ob_get_clean()
获取页面的输出缓冲区 - 对于每个挂钩:
- 执行挂钩
- 再次调用
ob_get_clean()
获取钩子的输出缓冲区 - 将页面的oputput缓冲区中的相应令牌替换为钩子的输出缓冲区
- 打印页面的输出缓冲区
- 调用
正如我所说:繁琐。我强烈建议不要这样做。我之所以提到它,是因为你提出了具体要求。它与的直观控制流程相矛盾
- 输入
- 正在处理
- 输出