Tôi gặp khó khăn trong việc quấn đầu quanh hai chức năng này. Tôi hiểu do_action()
nhưng tôi không thấy rõ khi nào do_action_ref_array()
sẽ hữu ích. Chúng ta không thể vượt qua một mảng do_action()
là tốt?
Tôi gặp khó khăn trong việc quấn đầu quanh hai chức năng này. Tôi hiểu do_action()
nhưng tôi không thấy rõ khi nào do_action_ref_array()
sẽ hữu ích. Chúng ta không thể vượt qua một mảng do_action()
là tốt?
Câu trả lời:
Nếu bạn chuyển một mảng tới do_action_ref_array()
, mỗi giá trị của phần tử của mảng đó sẽ được truyền dưới dạng một tham số riêng cho hàm gọi lại. Các phím bị mất.
Nếu bạn truyền một mảng tới do_action()
, mảng hoàn chỉnh sẽ được truyền dưới dạng một tham số duy nhất cho cuộc gọi lại. Các phím vẫn còn nguyên.
Hãy xem xét sự khác biệt giữa do_action()
và do_action_ref_array()
trong một plugin đơn giản:
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
}
Kết quả:
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()
đã được giới thiệu năm 2006 để xử lý các tham số được truyền bằng tham chiếu tốt hơn trong PHP 4. Một đánh giá về hàm 2011 đã được đóng lại dưới dạng wontfix . Nhưng kết luận là không sử dụng cho các chức năng mới trong WordPress nữa, vì trong PHP 5 bạn cũng có thể làm điều đó với do_action()
. Vấn đề từ năm 2006 không phải là vấn đề hiện nay.
Không sử dụng do_action_ref_array()
trong các móc tùy chỉnh của bạn, nhưng học cách đọc nó.