问题描述

围绕这两个功能我遇到麻烦。我明白了 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 referencereview of the function 2011 被关闭为 wontfix 。但结论是不再用于 WordPress 中的新功能,因为在 PHP 5 中,您也可以使用 do_action()。 2006 年的问题不是现在的问题。

不要在自定义钩子中使用 do_action_ref_array(),但要学习如何阅读它。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。