do_action_ref_array() WP 2.1.0

Створює подію (хук), на яку потім можна прикріпити PHP функції. Аргументи передаються як масиву.

Ця функція ідентична do_action() . Різниця в тому, що аргументи хука вказуються як масив. Це дозволяє передати просту змінну за посиланням (див. приклад 1).

Також ця функція може бути корисною, коли ми заздалегідь не знаємо, яка функція буде викликана і скільки в неї параметрів. Використовуючи цей хук, ми дамо можливість розробнику, який використовує самому вказати скільки параметрів може отримати функція прикріплена до хука. приклад :

Хуків немає.

Повертає

null. Нічого

Використання

do_action_ref_array ($ tag, $ arg);
$tag
(рядок) (обов’язковий)
Назва хука, який буде вішатися функції через функцію add_action().
$arg
(масив) (обов’язковий)
Параметри передаються функції, яка чіплятиметься на хук.

Приклади

0

#1 Різниця з do_action()

do_action( 'my_action', 'arg_1', true, 'foo', 'arg_4');

// це теж саме що

$args = ['arg_1', true, 'foo', 'arg_4'];

do_action_ref_array( 'my_action', $args);
0

#2 Приклад створення хука з передачею параметра посилання:

Можна вказати посилання на елемент масиву і вказати, що змінні коллбек функції також очікують посилання. Тепер, при зміні елемента масиву в колббек функції, зміниться і значення цього елемента за межами видимості функції.

// додамо коллбек функцію до хука
add_action( 'myhook', 'myhook_func');

function myhook_func( & $num ){
	$num = 2; // змінюємо змінну за посиланням
}

$num = 1;

// виклик хука
do_action_ref_array( 'myhook', array( & $num ) );

echo $num; //> 2
0

#3 Приклад створення хука з передачею об’єкта за посиланням:

Якщо масив містить об’єкт, то ніяких посилань передавати не потрібно, об’єкт і так завжди передається за посиланням:

// додамо коллбек функцію до хука
add_action( 'my_action', 'my_callback');

function my_callback( $my_object ) {
	$my_object->prop += 2; // додамо 2
}

// Створимо об'єкт
$my_object = New stdClass();
$my_object->prop = 1;

// запускаємо хук
do_action_ref_array( 'my_action', array( $my_object ) );

// бачимо, що об'єкт змінився
var_dump( $my_object->prop ); // int(3)

Оскільки об’єкт передається за посиланням автоматично, у цьому випадку ми можемо використовувати стандартну функцію do_action() замість do_action_ref_array():

do_action( 'my_action', $ my_object );

// бачимо, що об'єкт змінився
var_dump( $my_object->prop ); //> int(5)
0

#4 Передача безлічі параметрів {#multi-params}

add_action( 'my_action', 'my_callback', 10, 4);

function my_callback( $arg1 = '', $arg2 = '', $arg3 = '', $arg4 = '' ) {

	print_r(func_get_args());
}

$args = ['one', 'two', 'tree', 'four'];

do_action( 'my_action', $args[0], $args[1] );

/*
Array
(
	[0] => один
	[1] => two
)
*/

do_action_ref_array( 'my_action', $args);

/*
Array
(
	[0] => один
	[1] => two
	[2] => tree
	[3] => four
)
*/

// c PHP 5.6 можна зробити так:

do_action( 'my_action', ...$args );

/*
Array
(
	[0] => один
	[1] => two
	[2] => tree
	[3] => four
)
*/

нотатки

  • Дивіться: (hook_name) supplied using an array.
  • Global. WP_Hook[]. $wp_filter Stores all of the filters and actions.
  • Global. int[]. $wp_actions Stores number of times each action був triggered.
  • Global. Рядок[]. $wp_current_filter Stores список поточних filtrів з поточним одним останнім.

список змін

З версії 2.1.0Введено.

Код do_action_ref_array() WP 6.0.2

function do_action_ref_array( $hook_name, $args ) {
	Global $wp_filter, $wp_actions, $wp_current_filter;

	if ( ! isset ( $wp_actions [ $ hook_name ] ) ) {
		$wp_actions[ $hook_name ] = 1;
	} else {
		++$wp_actions[ $hook_name ];
	}

	// Do 'all' actions first.
	if ( isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
		$all_args = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
		_wp_call_all_hook($all_args);
	}

	if ( ! isset( $wp_filter[ $hook_name ] ) ) {
		if ( isset( $wp_filter['all'] ) ) {
			array_pop($wp_current_filter);
		}

		return;
	}

	if ( ! isset( $wp_filter['all'] ) ) {
		$wp_current_filter[] = $hook_name;
	}

	$wp_filter[ $hook_name ]->do_action( $args );

	array_pop($wp_current_filter);
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *