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