Commit 7e0d5c75e7e for php.net

commit 7e0d5c75e7e03f3a9abe488a3df0ab893e36c740
Author: Gina Peter Banyard <girgias@php.net>
Date:   Wed Aug 5 15:05:55 2026 +0100

    standard: deprecate passing an object to array_walk{_recursive}()

    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_array_parameter_of_array_walk_and_array_walk_recursive

diff --git a/Zend/tests/exceptions/gh16188.phpt b/Zend/tests/exceptions/gh16188.phpt
index 4516f7cade9..2be2f991c8f 100644
--- a/Zend/tests/exceptions/gh16188.phpt
+++ b/Zend/tests/exceptions/gh16188.phpt
@@ -16,6 +16,7 @@
 ?>
 ==DONE==
 --EXPECTF--
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 getTraceAsString:
 #0 {main}

diff --git a/Zend/tests/lazy_objects/array_walk.phpt b/Zend/tests/lazy_objects/array_walk.phpt
index afee146025c..3de8d6331a3 100644
--- a/Zend/tests/lazy_objects/array_walk.phpt
+++ b/Zend/tests/lazy_objects/array_walk.phpt
@@ -26,6 +26,7 @@ class C {

 ?>
 --EXPECTF--
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 TypeError: Cannot assign string to reference held by property C::$a of type int
 lazy proxy object(C)#%d (1) {
   ["instance"]=>
diff --git a/Zend/tests/property_hooks/gh18268.phpt b/Zend/tests/property_hooks/gh18268.phpt
index 9836bb6d962..78099923999 100644
--- a/Zend/tests/property_hooks/gh18268.phpt
+++ b/Zend/tests/property_hooks/gh18268.phpt
@@ -19,5 +19,6 @@ class B extends A {
 });

 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 int(42)
diff --git a/ext/ffi/tests/gh9697.phpt b/ext/ffi/tests/gh9697.phpt
index 7d19480e694..0f82c8b43a2 100644
--- a/ext/ffi/tests/gh9697.phpt
+++ b/ext/ffi/tests/gh9697.phpt
@@ -10,5 +10,6 @@
 array_walk($x, function($x) { echo "test\n"; });
 ?>
 DONE
---EXPECT--
+--EXPECTF--
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 DONE
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 51b1795b911..91d3932516e 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -1518,6 +1518,14 @@ PHP_FUNCTION(array_walk)
 		Z_PARAM_ZVAL(userdata)
 	ZEND_PARSE_PARAMETERS_END();

+	if (Z_TYPE_P(array) == IS_OBJECT) {
+		php_error_docref(NULL, E_DEPRECATED,
+			"Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead");
+		if (UNEXPECTED(EG(exception))) {
+			RETURN_THROWS();
+		}
+	}
+
 	php_array_walk(&context, array, userdata, /* recursive */ false);
 	RETURN_TRUE;
 }
@@ -1537,6 +1545,15 @@ PHP_FUNCTION(array_walk_recursive)
 		Z_PARAM_ZVAL(userdata)
 	ZEND_PARSE_PARAMETERS_END();

+
+	if (Z_TYPE_P(array) == IS_OBJECT) {
+		php_error_docref(NULL, E_DEPRECATED,
+			"Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead");
+		if (UNEXPECTED(EG(exception))) {
+			RETURN_THROWS();
+		}
+	}
+
 	php_array_walk(&context, array, userdata, /* recursive */ true);
 	RETURN_TRUE;
 }
diff --git a/ext/standard/tests/array/array_walk/array_walk_object1.phpt b/ext/standard/tests/array/array_walk/array_walk_object1.phpt
index 7c700be1184..cd722f04abc 100644
--- a/ext/standard/tests/array/array_walk/array_walk_object1.phpt
+++ b/ext/standard/tests/array/array_walk/array_walk_object1.phpt
@@ -38,6 +38,8 @@ public function __construct($setVal)
 ?>
 --EXPECTF--
 *** Testing array_walk() : object functionality ***
+
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 string(18) "%r\0%rMyClass%r\0%rpri_value"
 int(10)
 int(1)
diff --git a/ext/standard/tests/array/array_walk/array_walk_objects.phpt b/ext/standard/tests/array/array_walk/array_walk_objects.phpt
index 44b5b27e51e..cc50ad38b9c 100644
--- a/ext/standard/tests/array/array_walk/array_walk_objects.phpt
+++ b/ext/standard/tests/array/array_walk/array_walk_objects.phpt
@@ -33,10 +33,13 @@ class test {
 echo "Done\n";
 ?>
 --EXPECTF--
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 string(3) "foo"
 string(3) "foo"
 string(3) "bar"
 string(3) "bar"
+
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 string(13) "%r\0%rtest%r\0%rvar_pri"
 string(12) "test_private"
 string(10) "%r\0%r*%r\0%rvar_pro"
diff --git a/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt b/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt
index 91a97437d21..26082134f63 100644
--- a/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt
+++ b/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt
@@ -33,10 +33,13 @@ class test {
 echo "Done\n";
 ?>
 --EXPECTF--
+Deprecated: array_walk_recursive(): Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead in %s on line %d
 string(3) "foo"
 string(3) "foo"
 string(3) "bar"
 string(3) "bar"
+
+Deprecated: array_walk_recursive(): Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead in %s on line %d
 string(13) "%0test%0var_pri"
 string(12) "test_private"
 string(10) "%0*%0var_pro"
diff --git a/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt b/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt
index 9570bf8a02e..023117b09ed 100644
--- a/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt
+++ b/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt
@@ -36,6 +36,8 @@ public function __construct($setVal)
 ?>
 --EXPECTF--
 *** Testing array_walk_recursive() : object functionality ***
+
+Deprecated: array_walk_recursive(): Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead in %s on line %d
 string(18) "%r\0%rMyClass%r\0%rpri_value"
 int(10)
 int(1)
diff --git a/ext/standard/tests/array/array_walk/bug79839.phpt b/ext/standard/tests/array/array_walk/bug79839.phpt
index 643604cb9b2..fe7db73c468 100644
--- a/ext/standard/tests/array/array_walk/bug79839.phpt
+++ b/ext/standard/tests/array/array_walk/bug79839.phpt
@@ -18,7 +18,8 @@ class Test {
 var_dump($test);

 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d
 Cannot assign array to reference held by property Test::$prop of type int
 object(Test)#1 (1) {
   ["prop"]=>