問題描述
當我希望我的過濾器或動作鉤子覆蓋所有其他的,我將它分配給 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。