問題描述
圍繞這兩個功能我遇到麻煩。我明白了 do_action(),但是當 do_action_ref_array()有用時,我看不清楚。我們不能將陣列傳遞給 do_action()嗎?
最佳解決方法
-
如果將陣列傳遞給
do_action_ref_array(),則該陣列的每個元素的值將作為單獨的引數傳遞給回撥。鑰匙丟了。 -
如果將陣列傳遞給
do_action(),則完整陣列將作為單個引數傳遞給回撥。鑰匙保持原樣。
我們來看看 do_action()和 do_action_ref_array()在一個簡單的外掛中的區別:
add_action( 'wp_footer', 'action_diff_test' );
add_action( 'diff_action', 'diff_test_callback', 10, 999 );
add_action( 'diff_action_ref_array', 'diff_test_callback', 10, 999 );
/**
* call test actions
*/
function action_diff_test()
{
$args = array (
'foo' => 'bar',
'hello' => 'world',
0 => 123
);
do_action( 'diff_action', $args );
do_action_ref_array( 'diff_action_ref_array', $args );
}
/**
* callback for test actions
*/
function diff_test_callback()
{
$args = func_get_args();
print current_filter() . ', ' . func_num_args() . ' arguments';
?>
<pre><?php
print htmlspecialchars(
print_r( $args, TRUE ),
ENT_QUOTES,
'utf-8',
FALSE
);
?></pre>
<?php
}
結果:
diff_action, 1 arguments
Array
(
[0] => Array
(
[foo] => bar
[hello] => world
[0] => 123
)
)
diff_action_ref_array, 3 arguments
Array
(
[0] => bar
[1] => world
[2] => 123
)
do_action_ref_array()是 introduced 2006,在 PHP 4 中更好地處理引數 passed by reference 。 review of the function 2011 被關閉為 wontfix 。但結論是不再用於 WordPress 中的新功能,因為在 PHP 5 中,您也可以使用 do_action()。 2006 年的問題不是現在的問題。
不要在自定義鉤子中使用 do_action_ref_array(),但要學習如何閱讀它。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。