PHP Hooks 库中实现多过滤器并行执行并收集全部返回值的正确方法
发布时间 - 2025-12-29 00:00:00 点击率:次php-hooks 库的 `apply_filters()` 默认仅返回最后一个回调的返回值;若需收集所有已注册同名钩子的返回结果,须手动遍历调用或改用支持“累积模式”的钩子机制。
在 PHP-Hooks(bainternet/PHP-Hooks)中,add_filter() 允许为同一钩子名注册多个回调函数,但 apply_filters($hook, $value) 的行为是链式传递:前一个回调的返回值会作为参数传给下一个回调(即 $value 被不断覆盖),最终只返回最后一个回调的执行结果。这正是你观察到 'xy' 输出和最终数组仅含 y 的根本原因:
// 执行流程等价于: $value = 'some value to be passed'; $value = call_user_func($callback1, $value); // → "x" $value = call_user_func($callback2, $value); // → call_user_func($cb2, "x") → 输出 "x",返回 "y" // 最终 apply_filters 返回 "y"
因此,无法通过重复调用 add_filter('my_filter', ...) 并单次 apply_filters('my_filter', ...) 实现多结果收集。
✅ 正确解法:为每个逻辑回调分配唯一钩子名,并显式循环调用
app_hooks()->add_filter('my_filter_x', function ($value) {
echo $value; // 输出: some value to be passed
return "x";
});
app_hooks()->add_filter('my_filter_y', function ($value) {
echo $value; // 输出: some value to be passed(注意:不再是 "xy")
return "y";
});
$my_tabs = [];
$hook_names = ['my_filter_x', 'my_filter_y'];
foreach (
$hook_names as $hook) {
$result = app_hooks()->apply_filters($hook, 'some value to be passed');
$my_tabs[] = $result;
}
print_r($my_tabs);
// 输出:
// Array
// (
// [0] => x
// [1] => y
// )⚠️ 注意事项:
- 避免复用同一钩子名期望“并行执行”——PHP-Hooks 本质是过滤器链(filter chain),非事件总线(event bus);
- 若业务逻辑强依赖“同一语义钩子触发多个独立处理”,建议封装一层调度器,或迁移到更成熟的钩子系统(如 WordPress Hooks 或 Symfony EventDispatcher);
- 确保 php-hooks.php 已正确加载且 $hooks 全局实例唯一,多次调用 app_hooks() 应返回同一对象(可加 static $instance 缓存优化)。
总结:PHP-Hooks 的设计目标是值转换(transform),而非结果聚合(collect)。需要多结果时,请主动解耦钩子命名并循环调用——这是清晰、可控且符合库设计意图的做法。
# php
# word
# wordpress
# app
# internet
# 回调函数
# ai
# symfony
# Static
# 封装
# Filter
# 循环
# Event
# 对象
# 事件
# transform
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何配置Horizon来管理队列?(安装和使用)
Windows Hello人脸识别突然无法使用
Java解压缩zip - 解压缩多个文件或文件夹实例
Thinkphp 中 distinct 的用法解析
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Laravel如何使用Gate和Policy进行授权?(权限控制)
浅述节点的创建及常见功能的实现
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
北京的网站制作公司有哪些,哪个视频网站最好?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
如何快速生成专业多端适配建站电话?
phpredis提高消息队列的实时性方法(推荐)
如何在万网主机上快速搭建网站?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
如何做网站制作流程,*游戏网站怎么搭建?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
历史网站制作软件,华为如何找回被删除的网站?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
韩国服务器如何优化跨境访问实现高效连接?
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Laravel如何处理和验证JSON类型的数据库字段
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Python自动化办公教程_ExcelWordPDF批量处理案例
如何用wdcp快速搭建高效网站?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
网站页面设计需要考虑到这些问题
香港服务器租用费用高吗?如何避免常见误区?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
html如何与html链接_实现多个HTML页面互相链接【互相】
怎样使用JSON进行数据交换_它有什么限制
浅谈javascript alert和confirm的美化
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
香港服务器选型指南:免备案配置与高效建站方案解析
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
微信推文制作网站有哪些,怎么做微信推文,急?


$hook_names as $hook) {
$result = app_hooks()->apply_filters($hook, 'some value to be passed');
$my_tabs[] = $result;
}
print_r($my_tabs);
// 输出:
// Array
// (
// [0] => x
// [1] => y
// )