使用挂钩修改变量的正确方法如果要使用挂钩修改变量或任何值,最好使用过滤器挂钩(而不是操作挂钩)。虽然内部对操作和过滤器的实施几乎相同,但公约是:
使用动作挂钩,您可以在回调函数内执行某些操作、回显输出等,但既不返回任何内容,也不更改回调函数范围外的参数。
使用过滤器挂钩,您可以从回调函数返回一个值,然后在某个地方使用它,或者将其分配给回调函数外部的变量。
因此,请使用apply_filters
代码如下:
// using apply_filters() instead of the following do_action_ref_array() line
// do_action_ref_array( \'h5p_alter_user_result\', array( &$data, $result_id, $content_id, $user_id ) );
$data = apply_filters( \'h5p_alter_user_result\', $data, $result_id, $content_id, $user_id );
要与此匹配,请使用
add_filter
回调函数如下:
// Declare number of parameters to be passed in add_filter.
// According to our apply_filters() call,
// we expect 4 parameters to be passed to the callback function
add_filter( \'h5p_alter_user_result\', \'diff_test_callback\', 10, 4 );
function diff_test_callback( $data, $result_id, $content_id, $user_id ) {
// do something with $data
// remember: manipulation of $data doesn\'t have any affect
// outside of this function
// So we need this return
return $data;
}
do_action_ref_array
代码中的问题:
来自
do_action_ref_array
打电话,看起来你想通过
$data
作为参考:
do_action_ref_array( \'h5p_alter_user_result\', array( &$data, $result_id, $content_id, $user_id ) );
然而,自PHP 5.4以来,这种行为已经改变。
do_action_ref_array
不再将参数的引用传递给回调函数,而是传递一个副本。
而且call time pass by reference 自PHP 5.4以来不接受。所以最好是使用apply_filters
方法,如上面的代码所示。
尽管not recommended, 可以使用引用指针作为数组中的函数参数来完成您尝试的操作。像这样:
// add_action without passing the number of parameters
add_action( \'h5p_alter_user_result\', \'diff_test_callback\' );
// callback function implementation with reference pointer `&`
// for parameters you are expecting with reference
function diff_test_callback( $args ) {
// we need the reference of $data, so using & operator here.
$data = &$args[0];
$result_id = $args[1];
$content_id = $args[2];
$user_id = $args[3];
// now making changes to $data
// will be reflected outside the scope of this function
// no return is necessary
}
// at the time of executing the action,
// create the $args array with reference to $data
$args = array( &$data, $result_id, $content_id, $user_id );
do_action_ref_array( \'h5p_alter_user_result\', array( $args ) );
Warning: 再一次,尽管
do_action_ref_array
如果您仔细地处理引用,方法就可以工作,强烈建议您在此场景中使用filter-hook方法。