先考虑以下代码的输出
$str = '2015';
$str['url'] = array('www', 'oschina', 'net');
var_dump($str['url']);
在“常识下”,即如果你不加考虑就脱口而的话,亲爱的读者,你认为输出的结果会是什么?
思考空间 。。。
思考空间 。。。 。。。
思考空间 。。。 。。。 。。。
我今天遇到的诡异的问题
在今天下午编写代码的过程中,我发现一个相当诡异的问题。
起码,按我目前已有的经验,我一下子无法判断那个环节出了问题,虽然我知道我是出了问题。
上面三行代码给了此诡异问题本质的描述,但在我今天开发场景中,还是需要周折一番,才明白其中的缘由。
以下是简化后的开发场景:
/**
* @return array array('url' => array())
*/
function getVar() {
// ...
}
$arr = getVar();
$arr['url'] = array('www', 'oschina', 'net');
var_dump($arr['url']);
也就是说,我获取到一个数组后,修改其下标url的值,但赋值的是数组,结果输出却是一个字符串!而且还是一个字母“A”。
string(1) "A"
像刚才所说,我知道上面的代码中存在不可信的代码(即有BUG的代码),但我无法一下子定位出问题,甚至我怀疑是不是发生了“诡异事件”?
亲爱的读者,这是第二个问题,如果你遇到这种情况,你知道是哪里出了问题吗?
思考空间 。。。
思考空间 。。。 。。。
思考空间 。。。 。。。 。。。
为了给读者预留想象的空间,这里交错回答第一个问题。
第一个问题,很显然,输出的是 string(1) "A",那么以下代码又会输出什么呢?
var_dump($arr);
答案是会输出:
string(4) "A015"
既然我们知道输出的结果,我们可以定位问题的原因吗?
其实,我的开发场景中的代码有个BUG,getVar()函数没有返回一个数组,而是返回了一个字符串。这就回答了第二个问题。
问题的本质
简单来说,问题的本质可以这样来解答:
$str['url'] = array('www', 'oschina', 'net');
这一行代码发生的过程应该是:
1、intval('url') = 0 //字符串的下标只能是整数,所以会自动进行类型转换,url --> 0
2、strval(array('www', 'oschina', 'net')) = 'Array' //字符串下标的值只能是字符串,所以会自动进行类型转换,数组会转换成:Array
3、$str[0] = 'A' //进行赋值时,由于一个下标只能存放一个字符串,所以只会保存A
最终结果是:
$str = 'A' + '015';
小结
当遇到一个奇怪的问题时,我们往往会发现之前未意识到或者未注意到的语法问题。通过这个语法的问题,当我们越深入,越贴近,越能体会PHP这门语言当初设计之美。
仅当小文,作备忘。