我们可以看出, 基本上, 使用引号,和不使用引号的效率损失在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_EXCEPTION

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_EXCEPTION

我们可以看出(其实,根据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数组非数字键名加引号的必要性!相关推荐

  1. PHP数组关于数字键名的问题

    以下是对PHP数组数字键名的几点总结: 键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况 在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型 ...

  2. php 操作数组array_merge使用时数组包含数字键名的问题解决方法

    问题如下: <!DOCTYPE html> <html> <body><?php $age=array("123"=>"3 ...

  3. 前端:JS/20/数组(数组的概念,数组元素,数组索引,数组元素的访问,数组的长度,数组的创建方法,数组的操作,实例:使用数组保存个人信息,实例:求数组所有值的平均值,数组对象的length属性)

    数组 1,数组的概念 一组值(或对象)的集合,称为"数组": var arr =[10,20,30,50]; var arr =["张三","男&qu ...

  4. java二维数组初始化值_Java二维数组初始化的方法

    对于一个新使用的工具,我们会进行初步的初始化工具,目的是为了加上一些使用的配置.在学过了一维数组后,那么二维数组是加了一层维度的一维数组.在初始化方面,二维数组有三种方法,相信很多人只是掌握了其中的一 ...

  5. python加减_python实现输入数字的连续加减方法

    不用库,写了很久,一直出bug,到网上一搜,可以直接输入之后,eval(str)即可得到结果! eval程序如下: s=input("请输入要运算的数字") print(" ...

  6. php调用其他文件数组的值,PHP递归调用数组值并用其执行指定函数

    0 PHP递归调用数组值并用其执行指定函数 围观:259℉更新时间:2014-10-29 function function_deep($function,$value) { try { if(!fu ...

  7. php数组的值转字符串,php 数组值怎么转字符串

    在php中可以通过implode函数将php数组值转为字符串,其语法是"implode(separator,array)",其中参数separator规定数组元素之间放置的内容. ...

  8. php文件夹下所有图片加水印软件,PHP经典的给图片加水印程序

    PHP经典的给图片加水印程序 更新时间:2006年12月06日 00:00:00   作者: /**************************************************** ...

  9. python遍历数组的两种方法加条件输出数组的值

    第一种方法 1.通过for in遍历数组. 其实本质就是取出来的是这个数组或者列表中的元素,和角标无关. for predict_scores in predict_scores:print(pred ...

最新文章

  1. pfsense 2.2RC版本应用
  2. eplan怎样创建和修改图框_EPLAN标题页及图框的设计
  3. 统计数据:Google排名高的是什么样的页面?
  4. while语句 ///do...while语句/// for语句/// foreach语句
  5. 全自动抠图换背景软件下载_抠图换背景的证件照软件
  6. R 语言从Github上安装R语言的程序包
  7. 通达信资金净流入公式_净流入副图源码指标 通达信 贴图
  8. 学习帮——提高智商、改善记忆力的120种绝佳方法!
  9. python 趋势跟踪算法_DualThrust区间突破策略Python版
  10. 微信小程序:事件传参
  11. SPSS学习(三)可靠性(用α系数衡量)
  12. matlab一元方差分析方法,多元方差分析matlab程序.doc
  13. 互联网+脑科学,中国脑计划的机会
  14. linpack环境搭建:Openmpi+Openblas+HPL安装教程
  15. 电脑开不了机是不是电源坏了
  16. 将大文件 分卷 压缩
  17. python npv 计算公式_PMP知识点总结 -- 净现值(NPV)
  18. QML控件--MenuBar
  19. Android Studio代码检查lint使用
  20. java 语言程序设计 李尊朝 第12章 Swing 组件

热门文章

  1. 什么是堆,栈,内存泄漏和内存溢出?
  2. 通过 SSH 连接到 VMware NAT 模式下的 Ubuntu 虚拟机环境
  3. java如何爬取304_HTTP 304错误的详细讲解
  4. ios 侧滑返回停顿_iOS push侧滑返回功能实现方法
  5. 6a标准 api_【阀门标准】API SPEC 6A CHINESE-2010中文版.pdf
  6. 对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)
  7. java maven 读写pdf_Java 在PDF中加盖骑缝章
  8. 公办低分二本_山东的5所专科院校,属于本省公办,适合低分学生报考
  9. 秒过,度目智慧通行让常态化防疫更高效
  10. atomic原子类实现机制_Java并发包-atomic包-让您彻底掌握AtomicInteger源码