我见过很多人在数组操作时,不要使用数组中非数字键的引号。
复制代码代码如下所示:
$ $;

我可以理解,有些人可能认为代码是整洁的,可以正确地执行。
更幸运的是,如果他幸运的拥有一个好的PHP配置:
复制代码代码如下所示:
error_reporting = ~ e_notic

他可能总是沉浸在简洁的风格中,没有看到任何暗示,也没有意识到他会失去多少表演。
来吧,让我们看看。
Good.php:
复制代码代码如下所示:
< PHP
数组=();
$ I = 0;
当(+ $ i < 1000){
数组{} = 2;
}
>

Bad.php:
复制代码代码如下所示:
< PHP
数组=();
$ I = 0;
当(+ $ i < 1000){
数组{ { } = 2;
}
>

分别运行时(多个平均时间):
引用:
复制代码代码如下所示:
时间good.php美元PHP - F
真正的0m0.013s
用户0m0.005s
系统0m0.007

没有引号:
复制代码代码如下所示:
时间bad.php美元PHP - F
注意:使用PHP的待定常数的坏assumed'bad'in / / /家惠新辰TMP / bad.php
在线(此处省略999条通知)
真正的0m0.100s
用户0m0.020s
系统0m0.029

看,差距有多大
好吧,也许我们应该模拟那些幸运的人的情况,并去掉记录通知的花费,看看它。
复制代码代码如下所示:
时间bad.php美元PHP - F
真正的0m0.037s
用户0m0.018s
系统0m0.018

从根本上看,使用引号和不使用引号的效率损失是3倍以上。
那么,这些效率损失在哪里呢
我们来看看两文件产生的码序列,分别。
Good.php:
复制代码代码如下所示:
文件名: / / /家惠新辰TMP / good.php
编译变量:!0 =数组,!1 = I $
取操作数# ext返回线OP
-------------------------------------------------------------------------------
20 init_array ~ 0
1分配!0,0
32分配!1, 0
43 pre_inc 3美元!一
4 is_smaller ~ 4 3, 1000美元
5 jmpz ~ 4 -> 9
56 zend_assign_dim!0,良好
7 zend_op_data 2,6美元
68 JMP -> 3
89返回1
10×zend_handle_exceptio

Bad.php:
复制代码代码如下所示:
文件名: / / /家惠新辰TMP / bad.php
编译变量:!0 =数组,!1 = I $
取操作数# ext返回线OP
-------------------------------------------------------------------------------
20 init_array ~ 0
1分配!0,0
32分配!1, 0
43 pre_inc 3美元!一
4 is_smaller ~ 4 3, 1000美元
5 jmpz ~ 4 -> 10
56 fetch_constant ~ 5'bad
7 zend_assign_dim!0,5
8 zend_op_data 2,7美元
69 JMP -> 3
810返回1
11×zend_handle_exceptio

我们可以看到(事实上,根据公告,PHP也会知道)没有引号的名字作为常量来获取,当找不到时,抛出一个通知,然后根据常量来生成一个字符串,然后把字符串作为键。
您将明智地认为,可能有一个意想不到的错误如下:
复制代码代码如下所示:
定义('key_name ','laruence);
的…
省略了许多行代码
{ } = 2美元key_name阵列; / /成数组{ 'laruence} = 2;
这样的错误,你会很沮丧的。。

明白非数字键数组键必须有引号啊
记住,有人会说,当替换字符串变量时,引号会引起错误。
标准写作:
复制代码代码如下所示:
为字符串=变量值{数组{关键'} }

我同意:懒惰,但懒惰也应该有原则。
最后,好的代码不应该被关闭error_reporting伪装。
注意,fetch_constant码找不到恒定的逻辑关联:
复制代码代码如下所示:
的…
如果(!zend_get_constant(opline -> OP2。u.constant。价值。str.val)
opline -> op2.u.constant.value.str.len,ex_t(opline ->结果。u.var)。tmp_var tsrmls_cc)){
zend_error(e_notice,使用未定义的常数%s为%s
opline -> op2.u.constant.value.str.val,
opline -> OP2。u.constant。价值str.val);
ex_t(opline ->结果。u.var)。tmp_var = opline -> op2.u.constant; / / 常数名称的字符串
zval_copy_ctor(ex_t(opline ->结果。u.var)。tmp_var); / /空间分布,生成的字符串
}
的…