summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/json/json.c13
-rw-r--r--ext/json/tests/bug73991.phpt28
2 files changed, 36 insertions, 5 deletions
diff --git a/ext/json/json.c b/ext/json/json.c
index 38fc587ab9..9803f48a3a 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -259,13 +259,14 @@ static PHP_FUNCTION(json_decode)
char *str;
size_t str_len;
zend_bool assoc = 0; /* return JS objects as PHP objects by default */
+ zend_bool assoc_null = 1;
zend_long depth = PHP_JSON_PARSER_DEFAULT_DEPTH;
zend_long options = 0;
ZEND_PARSE_PARAMETERS_START(1, 4)
Z_PARAM_STRING(str, str_len)
Z_PARAM_OPTIONAL
- Z_PARAM_BOOL(assoc)
+ Z_PARAM_BOOL_EX(assoc, assoc_null, 1, 0)
Z_PARAM_LONG(depth)
Z_PARAM_LONG(options)
ZEND_PARSE_PARAMETERS_END();
@@ -288,10 +289,12 @@ static PHP_FUNCTION(json_decode)
}
/* For BC reasons, the bool $assoc overrides the long $options bit for PHP_JSON_OBJECT_AS_ARRAY */
- if (assoc) {
- options |= PHP_JSON_OBJECT_AS_ARRAY;
- } else {
- options &= ~PHP_JSON_OBJECT_AS_ARRAY;
+ if (!assoc_null) {
+ if (assoc) {
+ options |= PHP_JSON_OBJECT_AS_ARRAY;
+ } else {
+ options &= ~PHP_JSON_OBJECT_AS_ARRAY;
+ }
}
php_json_decode_ex(return_value, str, str_len, options, depth);
diff --git a/ext/json/tests/bug73991.phpt b/ext/json/tests/bug73991.phpt
new file mode 100644
index 0000000000..06aba555f0
--- /dev/null
+++ b/ext/json/tests/bug73991.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Allow JSON_OBJECT_AS_ARRAY to have an effect
+--FILE--
+<?php
+
+$json = '{"foo":"bar"}';
+
+var_dump(json_decode($json, false));
+var_dump(json_decode($json, true));
+var_dump(json_decode($json, null, 512, 0));
+var_dump(json_decode($json, null, 512, JSON_OBJECT_AS_ARRAY));
+--EXPECTF--
+object(stdClass)#%d (1) {
+ ["foo"]=>
+ string(3) "bar"
+}
+array(1) {
+ ["foo"]=>
+ string(3) "bar"
+}
+object(stdClass)#%d (1) {
+ ["foo"]=>
+ string(3) "bar"
+}
+array(1) {
+ ["foo"]=>
+ string(3) "bar"
+}