background image

   

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 来伪装.