巅云智能建站平台搭建版(创业流派版)火爆上线,毕生受权!新增:文章智能收罗+全站真静态打包+城市分站+智能小法式+不法词过滤+H5自顺应+智能链词等功效功效概况
建站专提News

分解数组非数字键名引号的须要性

一佰互联网站开辟设想(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开辟和域名注册及假造主机办事经历,供给的办事更是天下着名。最近几年来还整合团队上风自立开辟了可视化多用户”“3.0平台版,拖拽排版网站建造设想,轻松完成pc站、手机微网站、小法式、APP一体化全网营销网站扶植 ,已胜利的为天下上百家收集公司供给自助建站平台搭建办事。更多资讯:tags标签

相干消息more

01
05月
菜鸟学PHP之Smarty入门

刚起头打仗模版引擎的PHP设想师,听到Smarty时,城市感觉很难。实在笔者也不破例,碰都不敢碰一下。可是厥后在分解XOOPS的法式架构时,... >>概况

30
04月
php中json_encode中文编码题目分

比方:"胥"颠末json_encode处置后变为"u80e5",终究的json中中文局部被替代为unicode编码。咱们要处理的便是将东西转... >>概况

23
04月
centos7(redhat7)若何卸载自带

redhat 的更新包只对注册的用户失效,以是咱们本身手动变动成CentOS 的更新包,CentOS几近和redhat是一样的,以是无需担忧... >>概况

02
05月
企业重竞价轻优化的缘由分解

一向以来企业成立官方网站后都是挑选竞价的体例,很少有企业情愿测验考试SEO优化的体例做互联网营销,究竟是甚么缘由致使的?良多伴侣说是企业不懂被建... >>概况

高端网站扶植

美工统筹SEO,为企业电子商务营销助力!

德律风:

023-85725751
建站

产物

域名注册 假造主机 云办事器 企业邮局
智能建站 APP打包 微站/小法式 创业平台
网站推行 媒体营销 智能收罗 AI机械人
400德律风 短信营销 店销机械人
私家定制 流派网站