Commit a49acfa9a7a for php.net
commit a49acfa9a7aeaa44a0c49bea15058d97d9238960
Author: Gina Peter Banyard <girgias@php.net>
Date: Mon Aug 10 21:02:56 2026 +0100
standard: deprecate passing objects to http_build_query() (#23202)
RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_data_parameter_of_http_build_query
diff --git a/ext/standard/http.c b/ext/standard/http.c
index d65e7a8acaa..eee1018672b 100644
--- a/ext/standard/http.c
+++ b/ext/standard/http.c
@@ -158,6 +158,11 @@ PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
if (Z_TYPE_P(zdata) == IS_ARRAY
|| (Z_TYPE_P(zdata) == IS_OBJECT
&& !(Z_OBJCE_P(zdata)->ce_flags & ZEND_ACC_ENUM))) {
+ if (Z_TYPE_P(zdata) == IS_OBJECT) {
+ php_error_docref(NULL, E_DEPRECATED,
+ "object values within argument #1 $data to http_build_query() being interpreted as arrays is deprecated,"
+ " instead the $data argument should be preprocessed with get_object_vars()");
+ }
zend_string *new_prefix;
if (key) {
zend_string *encoded_key;
@@ -236,9 +241,13 @@ PHP_FUNCTION(http_build_query)
Z_PARAM_LONG(enc_type)
ZEND_PARSE_PARAMETERS_END();
- if (UNEXPECTED(Z_TYPE_P(formdata) == IS_OBJECT && (Z_OBJCE_P(formdata)->ce_flags & ZEND_ACC_ENUM))) {
- zend_argument_type_error(1, "must not be an enum, %s given", zend_zval_value_name(formdata));
- RETURN_THROWS();
+ if (UNEXPECTED(Z_TYPE_P(formdata) == IS_OBJECT)) {
+ if (Z_OBJCE_P(formdata)->ce_flags & ZEND_ACC_ENUM) {
+ zend_argument_type_error(1, "must not be an enum, %s given", zend_zval_value_name(formdata));
+ RETURN_THROWS();
+ }
+ php_error_docref(NULL, E_DEPRECATED,
+ "Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead");
}
php_url_encode_hash_ex(HASH_OF(formdata), &formstr, prefix, prefix_len, /* key_prefix */ NULL, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL), arg_sep, (int)enc_type);
diff --git a/ext/standard/tests/http/http_build_query/bug26817.phpt b/ext/standard/tests/http/http_build_query/bug26817.phpt
index e3b6539a1cc..2014cbadf2e 100644
--- a/ext/standard/tests/http/http_build_query/bug26817.phpt
+++ b/ext/standard/tests/http/http_build_query/bug26817.phpt
@@ -21,6 +21,9 @@ function foo()
$obj->foo();
var_dump(http_build_query($obj));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
string(27) "foo=lala&bar=meuh&test=test"
+
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
string(9) "test=test"
diff --git a/ext/standard/tests/http/http_build_query/http_build_query_object_basic.phpt b/ext/standard/tests/http/http_build_query/http_build_query_object_basic.phpt
index 91bb8fc6229..4b9a4da4959 100644
--- a/ext/standard/tests/http/http_build_query/http_build_query_object_basic.phpt
+++ b/ext/standard/tests/http/http_build_query/http_build_query_object_basic.phpt
@@ -13,5 +13,6 @@ class KeyVal {
// Percent encoded "public=input"
var_dump(http_build_query($o));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
string(12) "public=input"
diff --git a/ext/standard/tests/http/http_build_query/http_build_query_object_empty.phpt b/ext/standard/tests/http/http_build_query/http_build_query_object_empty.phpt
index 7aca03df4a6..f154d116904 100644
--- a/ext/standard/tests/http/http_build_query/http_build_query_object_empty.phpt
+++ b/ext/standard/tests/http/http_build_query/http_build_query_object_empty.phpt
@@ -7,5 +7,6 @@ class EmptyObj {}
var_dump(http_build_query($o));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
string(0) ""
diff --git a/ext/standard/tests/http/http_build_query/http_build_query_object_just_stringable.phpt b/ext/standard/tests/http/http_build_query/http_build_query_object_just_stringable.phpt
index 4c65547b81c..9f19ba9d31b 100644
--- a/ext/standard/tests/http/http_build_query/http_build_query_object_just_stringable.phpt
+++ b/ext/standard/tests/http/http_build_query/http_build_query_object_just_stringable.phpt
@@ -15,8 +15,15 @@ public function __toString() : string {
var_dump(http_build_query(['hello', $o], numeric_prefix: 'prefix_'));
var_dump(http_build_query($o, numeric_prefix: 'prefix_'));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): object values within argument #1 $data to http_build_query() being interpreted as arrays is deprecated, instead the $data argument should be preprocessed with get_object_vars() in %s on line %d
string(7) "0=hello"
+
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
string(0) ""
+
+Deprecated: http_build_query(): object values within argument #1 $data to http_build_query() being interpreted as arrays is deprecated, instead the $data argument should be preprocessed with get_object_vars() in %s on line %d
string(14) "prefix_0=hello"
+
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
string(0) ""
diff --git a/ext/standard/tests/http/http_build_query/http_build_query_object_key_val_stringable.phpt b/ext/standard/tests/http/http_build_query/http_build_query_object_key_val_stringable.phpt
index 2a738df362a..dfcdde9b669 100644
--- a/ext/standard/tests/http/http_build_query/http_build_query_object_key_val_stringable.phpt
+++ b/ext/standard/tests/http/http_build_query/http_build_query_object_key_val_stringable.phpt
@@ -16,5 +16,6 @@ public function __toString(): string {
var_dump(http_build_query($o));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
string(12) "public=input"
diff --git a/ext/standard/tests/http/http_build_query/http_build_query_object_nested.phpt b/ext/standard/tests/http/http_build_query/http_build_query_object_nested.phpt
index 125327f0af0..6bb3912ff21 100644
--- a/ext/standard/tests/http/http_build_query/http_build_query_object_nested.phpt
+++ b/ext/standard/tests/http/http_build_query/http_build_query_object_nested.phpt
@@ -16,5 +16,8 @@ class KeyVal {
// Percent encoded "public[public]=input"
var_dump(http_build_query($o));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
+
+Deprecated: http_build_query(): object values within argument #1 $data to http_build_query() being interpreted as arrays is deprecated, instead the $data argument should be preprocessed with get_object_vars() in %s on line %d
string(24) "public%5Bpublic%5D=input"
diff --git a/ext/standard/tests/http/http_build_query/http_build_query_object_recursif.phpt b/ext/standard/tests/http/http_build_query/http_build_query_object_recursif.phpt
index ec415fc115b..132a8b4242a 100644
--- a/ext/standard/tests/http/http_build_query/http_build_query_object_recursif.phpt
+++ b/ext/standard/tests/http/http_build_query/http_build_query_object_recursif.phpt
@@ -13,5 +13,8 @@ class KeyVal {
var_dump(http_build_query($o));
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
+
+Deprecated: http_build_query(): object values within argument #1 $data to http_build_query() being interpreted as arrays is deprecated, instead the $data argument should be preprocessed with get_object_vars() in %s on line %d
string(0) ""
diff --git a/ext/standard/tests/http/http_build_query/http_build_query_variation1.phpt b/ext/standard/tests/http/http_build_query/http_build_query_variation1.phpt
index d1eaffb25b4..3f00469433e 100644
--- a/ext/standard/tests/http/http_build_query/http_build_query_variation1.phpt
+++ b/ext/standard/tests/http/http_build_query/http_build_query_variation1.phpt
@@ -20,6 +20,9 @@ class UrlBuilder
echo http_build_query($obj) . PHP_EOL;
echo http_build_query(new UrlBuilder());
?>
---EXPECT--
+--EXPECTF--
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
name=homepage&page=1&sort=desc%2Cname
+
+Deprecated: http_build_query(): Passing an object for argument #1 $data to http_build_query() is deprecated, call get_object_vars() first instead in %s on line %d
name=homepage&page=1