Unterschied zwischen do_action_ref_array () und do_action ()

7

Ich habe Probleme, meinen Kopf um diese beiden Funktionen zu wickeln. Ich verstehe, do_action()aber ich sehe nicht klar, wann do_action_ref_array()es nützlich wäre. Könnten wir nicht auch ein Array übergeben do_action()?

urok93
quelle

Antworten:

13
  • Wenn Sie ein Array an übergeben do_action_ref_array(), wird der Wert jedes Elements dieses Arrays als separater Parameter an den Rückruf übergeben. Die Schlüssel sind verloren.

  • Wenn Sie ein Array an übergeben do_action(), wird das gesamte Array als ein einziger Parameter an den Rückruf übergeben. Die Schlüssel bleiben intakt.

Schauen wir uns die Unterschiede zwischen do_action()und do_action_ref_array()in einem einfachen Plugin an:

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
}

Ergebnis:

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()wurde 2006 eingeführt , um Parameter, die als Referenz übergeben wurden , in PHP 4 besser zu behandeln. Eine Überprüfung der Funktion 2011 wurde als wontfix abgeschlossen . Die Schlussfolgerung war jedoch, nicht mehr für neue Funktionen in WordPress zu verwenden, da Sie dies in PHP 5 auch tun können do_action(). Das Problem von 2006 ist heutzutage kein Problem.

Verwenden Sie es nicht do_action_ref_array()in Ihren benutzerdefinierten Hooks, sondern lernen Sie, wie man es liest.

Fuxia
quelle