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

From: Date: Mon, 10 Aug 2026 17:21:29 +0000
Subject: [php-src] master: standard: deprecate passing an object to array_walk{_recursive}()
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-140600@lists.php.net to get a copy of this message
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"]=>

« previous php.cvs (#140600) next »