PHP Hooks 库中实现多过滤器链式调用并收集全部返回值的正确方法
发布时间 - 2025-12-29 00:00:00 点击率:次php-hooks 库的 `app
ly_filters()` 默认仅返回最后一个回调的执行结果;若需收集所有已注册同名钩子的返回值,必须手动遍历调用或改用支持“过滤器链聚合”的设计模式。
在 PHP-Hooks(bainternet/PHP-Hooks)中,add_filter() 允许为同一钩子名(如 'my_filter')注册多个回调函数,但其核心机制是链式传递:每个回调接收前一个回调的返回值作为输入,并最终只返回最后一个回调的结果。这与 WordPress 的 apply_filters() 行为一致——它不是“广播式”调用,而是值流式处理。
因此,你原始代码中:
app_hooks()->add_filter('my_filter', fn($v) => { echo $v; return "x"; });
app_hooks()->add_filter('my_filter', fn($v) => { echo $v; return "y"; });
$my_tabs[] = app_hooks()->apply_filters('my_filter', 'some value to be passed');实际执行流程为:
- 第一个回调接收 'some value to be passed',输出该字符串,返回 "x";
- 第二个回调接收 "x"(而非原始字符串),输出 "x",返回 "y";
- apply_filters() 最终只返回 "y" → $my_tabs = ['y']。
✅ 正确解法:避免复用同一钩子名进行“并行收集”,而应显式分发调用
推荐采用以下结构,清晰、可控且符合库设计意图:
// 为每个逻辑独立的处理器分配唯一钩子名
app_hooks()->add_filter('my_filter_x', function ($value) {
echo $value . "\n"; // 输出: some value to be passed
return "x";
});
app_hooks()->add_filter('my_filter_y', function ($value) {
echo $value . "\n"; // 输出: some value to be passed
return "y";
});
// 手动批量触发不同钩子,收集全部返回值
$hook_names = ['my_filter_x', 'my_filter_y'];
$my_tabs = [];
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
// )⚠️ 注意事项:
- 不要依赖 apply_filters() 自动聚合多个同名回调的返回值——该库不提供类似 apply_filters_array() 的原生方法;
- 若业务逻辑强依赖“同一语义钩子下多处理器并行执行+结果合并”,建议自行封装工具函数,例如:
function apply_filters_all($hook, $value) { $hooks = app_hooks()->get_filters($hook); // 注意:需确认库是否暴露 get_filters() $results = []; foreach ($hooks as $callback) { $results[] = call_user_func($callback, $value); } return $results; }(注:PHP-Hooks 默认未公开 get_filters() 方法,如需此能力,需扩展类或修改源码)
? 总结:PHP-Hooks 是轻量级钩子实现,强调链式数据流而非事件广播。追求“多回调并行返回”时,请主动管理钩子命名与调用逻辑——这是设计使然,而非使用错误。
# php
# word
# wordpress
# 处理器
# app
# internet
# 回调函数
# 工具
# ai
# 封装
# 字符串
# 事件
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
中国移动官方网站首页入口 中国移动官网网页登录
如何在宝塔面板中创建新站点?
java ZXing生成二维码及条码实例分享
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何用景安虚拟主机手机版绑定域名建站?
Python文件流缓冲机制_IO性能解析【教程】
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
EditPlus中的正则表达式 实战(4)
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
微信小程序 canvas开发实例及注意事项
Laravel如何自定义错误页面(404, 500)?(代码示例)
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
JavaScript Ajax实现异步通信
原生JS实现图片轮播切换效果
Laravel如何创建自定义Artisan命令?(代码示例)
如何在Windows虚拟主机上快速搭建网站?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
网站图片在线制作软件,怎么在图片上做链接?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何在腾讯云服务器上快速搭建个人网站?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
深圳网站制作平台,深圳市做网站好的公司有哪些?
制作公司内部网站有哪些,内网如何建网站?
浅述节点的创建及常见功能的实现
网站制作价目表怎么做,珍爱网婚介费用多少?
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
详解Oracle修改字段类型方法总结
如何快速重置建站主机并恢复默认配置?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何彻底删除建站之星生成的Banner?
高端企业智能建站程序:SEO优化与响应式模板定制开发
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
linux top下的 minerd 木马清除方法
高端网站建设与定制开发一站式解决方案 中企动力
Java解压缩zip - 解压缩多个文件或文件夹实例
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel如何使用模型观察者?(Observer代码示例)
,南京靠谱的征婚网站?

