PHP对象强制转换数组的Bug

最近在写前端页面时,由于前后分离开发,采用了fms去mock后端数据接口,提交构造的json数据到服务器端后用fms-smarty将提交上来的json数据模拟解析成数组后直接渲染smarty模板页面开发。但是渲染出来的页面在前端总是报错Undefined offset

构造了类似两个数组

$ids = [1,2,3];
$idTypes=['1' => 'a', '2' => 'b', '3' => 'c'];

在模板中直接以$idTypes[$ids[0]]取出类型来。但是实际构造出来后,发现前端报错“Notice: Undefined offset: 1 in ………”,用var_dump($idTypes) 和 ids[0] 都正常有值,但是两个组合$idTypes[$ids[0]]就取不出值了。最后看了fms-smarty代码是json_decode($_POST[‘_fms’])对象后用(array)强制转换成了PHP数组,就想想为啥不直接json_decode($_POST[‘_fms’], true)直接转换,后来试了下居然能够正常解析,以下是我构造的整个流程代码原型

<?php

$arr = ['1' => 'test_1', 'name' => 'test_name'];
$json = json_encode($arr);

$data = json_decode($json);
$data = (array) $data;

$data2 = json_decode($json, true);

echo '<pre>';

echo '---------- arr --------- <br>';
var_dump($arr);
var_dump($arr['1']);

echo '<br>---------- data --------- <br>';
var_dump($data);
var_dump($data['1']);

echo '<br>---------- data 2 --------- <br>';
var_dump($data2);
var_dump($data2['1']);

echo '</pre>';
?>

可以看到输出结果var_dump($data[‘1’]);报错了:

75f79c6a-bce1-492e-b406-ee272fc6f5b0 发现用json_decode($json, true)解析出来的数组跟(array)json_decode($json)解析出来的数组却不同,仔细看arr[1]和data[“1”]的键”1″加了双引号,所以没取出,后google查找发现了PHP文档http://php.net/language.types.array#language.types.array.casting有这么解释:
img_2760
PHP对象转换数组时,整数属性是无法访问的。没熟读文档确实是踩坑不少。

后记:跟同事交流后,同事发了一篇鸟哥的文章PHP类型转换相关的一个Bug > http://www.laruence.com/2010/05/26/1541.html看来确实我踩到了同样的问题。

但是有个例子就是数组转对象再转数组后,数组中的指定元素还是可以访问;但是直接声明属性为整数的对象,转换成数组就是无法访问,有点诡异的逻辑。

2 thoughts on “PHP对象强制转换数组的Bug”

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>