问题描述
围绕这两个功能我遇到麻烦。我明白了 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。