文档章节

一个诡异、有趣但具深度的PHP问题

暗夜在火星
 暗夜在火星
发布于 2015/05/29 19:20
字数 732
阅读 59
收藏 0

先考虑以下代码的输出

$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这门语言当初设计之美。

仅当小文,作备忘。

© 著作权归作者所有

暗夜在火星

暗夜在火星

粉丝 168
博文 177
码字总数 326789
作品 1
广州
程序员
私信 提问
ibatis3 一个小bug

Ibatis 3 mapper映射文件名称大小写问题: 居然名字CPManagerSqlMapper.xml有个字母应该小写的(CpManagerSqlMapper.xml),结果大写了,在配置文件: 程序在控制台测试的时候居然可以正常,但...

zhenghuazhi
2010/08/11
102
1
php 设置 response header 时的小问题

今天遇到一个感觉很诡异的问题,就是 php 设置header 总是不成功,设置为返回xml ,但总是返回html 。源码大概如下: 只要把header 一行移到第一个echo 的前面就行了 对php 理解和实践都不深...

鉴客
2011/10/26
3.2K
1
机器学习2017年重大进展汇总

很难相信在人工智能和机器学习领域里这一年发生了那么多的事情,很难做一个全面的系统的汇总。尽管如此,我还是尝试性的去做了一个汇总,希望能够帮助大家去回顾一下今天的科技到底发展到了何...

【方向】
2018/01/10
0
0
CodeHub#2 线上直播 | 从 0 到 1 构建移动分析架构

| Code Hub: 以线上直播的形式输出前沿的移动端开发实践。 定位为连接器,用分享、交流的形式触达更多开发者,从而让有趣、深度的思考能够双向互动起来。 | 本期话题:《从 0 到 1 构建移动...

烧碱
04/19
35
0
番外特别篇之 为什么我不建议你直接使用UIImage传值?--从一个诡异的相册九图连读崩溃bug谈起

关于"番外特别篇" 所谓"番外特别篇",就是系列文章更新期间内,随机插入的一篇文章.目前我正在更新的系列文章是 实现iOS图片等资源文件的热更新化.但是,这两天,被一个自己App中诡异的相册读取的...

ios122
2016/09/22
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部