问题描述
当我希望我的过滤器或动作钩子覆盖所有其他的,我将它分配给 999
的优先级。不过最近我看到有些人使用极限值来优先考虑,比如 20000
,甚至是 99999
除了使用优先级这个高可笑的事实,他们实际上可以工作吗?挂钩优先级有限吗?超过限制会发生什么?使用极端优先级时是否存在性能差异?
更新:@harke 建议 on Stack Overflow 数量受 PHP_MAX_INT
限制
最佳解决方案
没有限制,没有性能处罚。要理解为什么,您需要了解所有钩子是如何存储在 WP 生态系统中的。
首先,您需要了解所有钩子的存储位置以及它们的操作方式。过滤器和动作的所有钩子都存储在名为 wp_filter
的全局变量中,是的,动作钩子也存储在此变量中。这个变量是关联的数组,其中 key 是动作或过滤器的名称,value 是另一个关联数组。比如我们来看看’init’ 的动作,在这个阶段我们将看到如下结构:
$wp_filter = array(
'init' => array(...),
);
此子数组具有数字键和值作为数组。数字键是我们的优先事项。与数字键相关联的数组包含具有相同优先级的挂钩列表。所以如果我们调用 add_action( 'init', 'wpse8170_my_first_init', 20 )
,然后调用 add_action( 'init', 'wpse8170_my_second_init', 20 )
,最后调用 add_action( 'init', 'wpse8170_my_third_init', 10 )
,我们的例子如下所示:
$wp_filter = array(
'init' => array(
20 => array(
'wpse8170_my_first_init' => array(
'accepted_args' => 1, // the number of accepted arguments by your hook
'function' => 'wpse8170_my_first_init', // callback function
),
'wpse8170_my_second_init' => array(...),
),
10 => array(
'wpse8170_my_third_init' => array(...),
),
),
);
现在当 init
动作被触发时,所有的钩子都将使用 ksort
函数进行排序,我们的数组现在看起来如此:
array(
10 => array(
'wpse8170_my_third_init' => array(...),
),
20 => array(
'wpse8170_my_first_init' => array(
'accepted_args' => 1, // the number of accepted arguments by your hook
'function' => 'wpse8170_my_first_init', // callback function
),
'wpse8170_my_second_init' => array(...),
),
),
并且所有钩子将在此队列中执行:首先是'wpse8170_my_third_init'
,然后是'wpse8170_my_first_init'
,最后是'wpse8170_my_second_init'
。
所以你可以看到没有限制和惩罚,你可以使用任何可接受的值作为 PHP 环境的关联阵列的关键。
次佳解决方案
这是一个整数,所以在一个 32 位的 PHP 系统上,它将被限制在-2147483648 到 2147483647,64 位的 PHP 将被限制在-9223372036854775808 到 9223372036854775807 。
编辑:没有性能损失,它是一个整数。
但是…… 认真的:)
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。