From a9f37dce0c48b6735c11378307ed4bb47fd3f0e3 Mon Sep 17 00:00:00 2001
From: jrfnl <jrfnl@users.noreply.github.com>
Date: Tue, 15 Oct 2019 21:25:51 +0200
Subject: [PATCH] `do_action()`: Fix PHP-4 style passing of objects not longer
 broken out of array

---
 src/wp-includes/plugin.php      |  3 +++
 tests/phpunit/tests/actions.php | 21 +++++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/wp-includes/plugin.php b/src/wp-includes/plugin.php
index 3725292dcc..7a9d18b7a8 100644
--- a/src/wp-includes/plugin.php
+++ b/src/wp-includes/plugin.php
@@ -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 );
diff --git a/tests/phpunit/tests/actions.php b/tests/phpunit/tests/actions.php
index d23e6a63b2..3fb0f1d223 100644
--- a/tests/phpunit/tests/actions.php
+++ b/tests/phpunit/tests/actions.php
@@ -557,4 +557,25 @@ class Tests_Actions extends WP_UnitTestCase {
 		$p1->post_title = 'Bar1';
 		$p2->post_title = 'Bar2';
 	}
+
+	/**
+	 * Tests PHP 4 notation for calling actions while passing in an object by reference.
+	 *
+	 * @ticket 48312
+	 *
+	 * @group trac48312
+	 */
+	function test_action_args_4() {
+		$a   = new MockAction();
+		$tag = __FUNCTION__;
+		$val = new stdClass;
+
+		add_action( $tag, array( &$a, 'action' ) );
+		// call 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 ) );
+	}
 }
-- 
2.23.0.windows.1

