美工统筹SEO,为企业电子商务营销助力!
分解数组非数字键名引号的须要性
一佰互联网站开辟设想(www.taishanly.com) 宣布日期 2020-04-29 09:02:34 阅读数: 132
复制代码 代码以下:
$array[key] = $value;
我能够懂得有些人能够会感觉如许的代码很”整齐”, 并且也能一般履行.
愈甚至,若是他很”荣幸的”php设置装备摆设的好:
复制代码 代码以下:
error_reporting = ~E_NOTIC
他也许永久都沉醉在本身的”整齐”气概中, 看不就任何的NOTICE提醒, 也不会心识到, 他这么做, 能丧失几多的机能~
来, 咱们一路来看看:
good.php:
复制代码 代码以下:
<?php
$array = array();
$i = 0;
while(++$i < 1000){
$array["good"] = 2;
}
?>
bad.php:
复制代码 代码以下:
<?php
$array = array();
$i = 0;
while(++$i < 1000){
$array[good] = 2;
}
?>
别离看运转时辰(屡次均匀时辰):
加引号的:
复制代码 代码以下:
$ time php -f good.php
real 0m0.013s
user 0m0.005s
sys 0m0.007
不加引号的:
复制代码 代码以下:
$ time php -f bad.php
PHP Notice: Use of undefined constant bad - assumed "bad" in /home/huixinchen/tmp/bad.php
on line (此处省略999行NOTICE)
real 0m0.100s
user 0m0.020s
sys 0m0.029
看看,不同有多大?
哦, 也许咱们应当摹拟一下那些”荣幸的”人们的环境, 去掉破费在记实NOTICE的开消, 看看~
复制代码 代码以下:
$ time php -f bad.php
real 0m0.037s
user 0m0.018s
sys 0m0.018
咱们能够看出, 根基上, 利用引号,和不利用引号的效力丧失在3倍以上
那末, 这些效力丧失到那里去了呢?
咱们别离看下, 俩个文件天生的OPCODE序列:
good.php :
复制代码 代码以下:
filename: /home/huixinchen/tmp/good.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, ->9
5 6 ZEND_ASSIGN_DIM !0, "good"
7 ZEND_OP_DATA 2, $6
6 8 JMP ->3
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来假装.
附注, FETCH_CONSTANT OPCODE中找不到常量的相干逻辑:
复制代码 代码以下:
....
if (!zend_get_constant(opline->op2.u.constant.value.str.val,
opline->op2.u.constant.value.str.len, &EX_T(opline->result.u.var).tmp_var TSRMLS_CC)) {
zend_error(E_NOTICE, "Use of undefined constant %s - assumed "%s"",
opline->op2.u.constant.value.str.val,
opline->op2.u.constant.value.str.val);
EX_T(opline->result.u.var).tmp_var = opline->op2.u.constant;//获得"常量"名字符串
zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);//分派空间,天生字符串
}
....
上一篇: php接口与接口援用的深切分解 | 下一篇:php防注入及开辟宁静具体分解