PHP json_encode()不同环境表现差异及全局配置问询
PHP json_encode() 跨环境行为差异疑问
在不同PHP安装环境下,json_encode()函数的表现可能存在差异,比如会自动将字符串类型的数值转换为数字类型,即使代码中没有显式设置JSON_NUMERIC_CHECK选项。
示例代码:
$something = array( "value" => "1" ); $encoded = json_encode($something); echo $encoded;
服务器1返回结果:
{"value":"1"}
服务器2返回结果(未手动设置JSON_NUMERIC_CHECK,但值被编码为数字):
{"value":1}
疑问:是否存在自动设置JSON_NUMERIC_CHECK的全局配置?若存在,该配置在哪里设置,以及如何通过代码获取默认选项?
答案
确实存在全局配置控制该行为:PHP提供了
json_encode_options这个php.ini配置项,用于指定json_encode()的默认选项,其中就包含开启JSON_NUMERIC_CHECK的可能。配置位置与设置方式:
打开PHP的配置文件php.ini,查找json_encode_options配置项(如果不存在可自行添加),将其值设置为对应常量的数值即可。JSON_NUMERIC_CHECK的常量值为16,若要默认开启该选项,配置行应为:json_encode_options = 16修改后需要重启PHP服务(如FPM、Apache等)才能生效。
代码获取默认选项的方法:
可以通过ini_get('json_encode_options')函数获取当前配置的默认选项数值,再通过位运算判断是否包含JSON_NUMERIC_CHECK:$defaultJsonOptions = ini_get('json_encode_options'); // 判断是否默认开启了JSON_NUMERIC_CHECK if ($defaultJsonOptions & JSON_NUMERIC_CHECK) { echo '默认已开启JSON_NUMERIC_CHECK选项'; } else { echo '默认未开启JSON_NUMERIC_CHECK选项'; }
内容的提问来源于stack exchange,提问作者smolo
相关产品推荐
相关产品推荐

