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"]=>