8 9 RETURN 1
10* ZEND_HANDLE_EXCEPTIO
bad.php :
代码如下
:
filename: /home/huixinchen/tmp/bad.php
compiled vars: !0 = $array, !1 = $i
line # op fetch ext return operands
-------------------------------------------------------------------------------
2 0 INIT_ARRAY ~0
1 ASSIGN !0, ~0
3 2 ASSIGN !1, 0
4 3 PRE_INC $3 !1
4 IS_SMALLER ~4 $3, 1000
5 JMPZ ~4, ->10
5 6 FETCH_CONSTANT ~5 'bad'
7 ZEND_ASSIGN_DIM !0, ~5
8 ZEND_OP_DATA 2, $7
6 9 JMP ->3
8 10 RETURN 1
11* ZEND_HANDLE_EXCEPTIO
我们可以看出
(其实,根据 NOTICE 的提示也知道), PHP 会把没有引号引起来的键名当作是常
量去获取
, 当找不到的时候, 抛出一个 NOTICE, 然后再根据”常量明”生成一个字符串, 然后
再讲这个字符串做为键名继续
~
聪明的你一定会想到
, 可能会出现如下不可预期的错误:
代码如下
:
define('key_name' , 'laruence');
....
//省略很多行代码
$array[key_name] = 2;
//变成了 $array['laruence'] = 2;
//这样的错误, 你会很郁闷吧?
明白了么
? 数组中的非数字键的键名一定要有引号啊~
哦
, 还记得有人会说, 那在字符串变量替换的时候, 写引号会导致错误,
恩
, 标准写法:
代码如下
:
$string = "variable value is {$array['key']}"
我很赞同
:”be lazy”, 但是, lazy 也是应该有原则的.
最后
, 好的代码,不应该通过关闭 error_reporting 来伪装.