Plugins: Restore backward compatibility for PHP4-style passing of `array( &$this )` as action argument to `do_action()`.

This is a follow-up to [46149] to avoid unnecessary breakage in case of using the old notation.

Props david.binda, jrf.
Reviewed by azaozz.
Fixes #48312.

git-svn-id: https://develop.svn.wordpress.org/trunk@46568 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Sergey Biryukov 2019-10-22 00:09:39 +00:00
parent 67a937a2fd
commit 99d5986b0c
2 changed files with 22 additions and 0 deletions

View File

@ -470,6 +470,9 @@ function do_action( $tag, ...$arg ) {
if ( empty( $arg ) ) {
$arg[] = '';
} elseif ( is_array( $arg[0] ) && 1 === count( $arg[0] ) && isset( $arg[0][0] ) && is_object( $arg[0][0] ) ) {
// Backward compatibility for PHP4-style passing of `array( &$this )` as action `$arg`.
$arg[0] = $arg[0][0];
}
$wp_filter[ $tag ]->do_action( $arg );

View File

@ -153,6 +153,25 @@ class Tests_Actions extends WP_UnitTestCase {
$this->assertEquals( array( $val1, $val2 ), array_pop( $argsvar3 ) );
}
/**
* Tests PHP 4 notation for calling actions while passing in an object by reference.
*
* @ticket 48312
*/
function test_action_args_with_php4_syntax() {
$a = new MockAction();
$tag = __FUNCTION__;
$val = new stdClass;
add_action( $tag, array( &$a, 'action' ) );
// Ñall the action with PHP 4 notation for passing object by reference.
do_action( $tag, array( &$val ) );
$call_count = $a->get_call_count();
$argsvar = $a->get_args();
$this->assertSame( array( $val ), array_pop( $argsvar ) );
}
function test_action_priority() {
$a = new MockAction();
$tag = __FUNCTION__;