[php-src] master: standard: deprecate passing an object to array_walk{_recursive}()

Gina Peter Banyard <[email protected]>
Newsgroups gmane.comp.php.cvs.general
Message-ID <[email protected]>
Author: Gina Peter Banyard (Girgias)
Date: 2026-08-10T18:21:19+01:00

Commit: https://github.com/php/php-src/commit/7e0d5c75e7e03f3a9abe488a3df0ab893e36c740
Raw diff: https://github.com/php/php-src/commit/7e0d5c75e7e03f3a9abe488a3df0ab893e36c740.diff

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

Changed paths:
  M  Zend/tests/exceptions/gh16188.phpt
  M  Zend/tests/lazy_objects/array_walk.phpt
  M  Zend/tests/property_hooks/gh18268.phpt
  M  ext/ffi/tests/gh9697.phpt
  M  ext/standard/array.c
  M  ext/standard/tests/array/array_walk/array_walk_object1.phpt
  M  ext/standard/tests/array/array_walk/array_walk_objects.phpt
  M  ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt
  M  ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt
  M  ext/standard/tests/array/array_walk/bug79839.phpt


Diff:

diff --git a/Zend/tests/exceptions/gh16188.phpt b/Zend/tests/exceptions/gh16188.phpt
index 4516f7cade90..2be2f991c8f3 100644
--- a/Zend/tests/exceptions/gh16188.phpt
+++ b/Zend/tests/exceptions/gh16188.phpt
@@ -16,6 +16,7 @@ printf("__toString:\n%s\n\n", $re);
 ?>
 ==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 afee146025c9..3de8d6331a3c 100644
--- a/Zend/tests/lazy_objects/array_walk.phpt
+++ b/Zend/tests/lazy_objects/array_walk.phpt
@@ -26,6 +26,7 @@ var_dump($obj);
 
 ?>
 --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 9836bb6d9627..78099923999d 100644
--- a/Zend/tests/property_hooks/gh18268.phpt
+++ b/Zend/tests/property_hooks/gh18268.phpt
@@ -19,5 +19,6 @@ array_walk($b, function (&$item) {
 });
 
 ?>
---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 7d19480e6944..0f82c8b43a26 100644
--- a/ext/ffi/tests/gh9697.phpt
+++ b/ext/ffi/tests/gh9697.phpt
@@ -10,5 +10,6 @@ $x = FFI::cdef()->new('int');
 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 51b1795b9111..91d3932516eb 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 7c700be11846..cd722f04abc1 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 @@ echo "Done"
 ?>
 --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 44b5b27e51e8..cc50ad38b9c2 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 @@ try {
 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 91a97437d217..26082134f632 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 @@ try {
 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 9570bf8a02e2..023117b09edf 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 @@ echo "Done"
 ?>
 --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 643604cb9b20..fe7db73c4683 100644
--- a/ext/standard/tests/array/array_walk/bug79839.phpt
+++ b/ext/standard/tests/array/array_walk/bug79839.phpt
@@ -18,7 +18,8 @@ try {
 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"]=>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.