问题描述

当我希望我的过滤器或动作钩子覆盖所有其他的,我将它分配给 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。