php循环给数组每个值加引号,php数组非数字键名加引号的必要性!
我们可以看出, 基本上, 使用引号,和不使用引号的效率损失在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数组非数字键名加引号的必要性!相关推荐
- PHP数组关于数字键名的问题
以下是对PHP数组数字键名的几点总结: 键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况 在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型 ...
- php 操作数组array_merge使用时数组包含数字键名的问题解决方法
问题如下: <!DOCTYPE html> <html> <body><?php $age=array("123"=>"3 ...
- 前端:JS/20/数组(数组的概念,数组元素,数组索引,数组元素的访问,数组的长度,数组的创建方法,数组的操作,实例:使用数组保存个人信息,实例:求数组所有值的平均值,数组对象的length属性)
数组 1,数组的概念 一组值(或对象)的集合,称为"数组": var arr =[10,20,30,50]; var arr =["张三","男&qu ...
- java二维数组初始化值_Java二维数组初始化的方法
对于一个新使用的工具,我们会进行初步的初始化工具,目的是为了加上一些使用的配置.在学过了一维数组后,那么二维数组是加了一层维度的一维数组.在初始化方面,二维数组有三种方法,相信很多人只是掌握了其中的一 ...
- python加减_python实现输入数字的连续加减方法
不用库,写了很久,一直出bug,到网上一搜,可以直接输入之后,eval(str)即可得到结果! eval程序如下: s=input("请输入要运算的数字") print(" ...
- php调用其他文件数组的值,PHP递归调用数组值并用其执行指定函数
0 PHP递归调用数组值并用其执行指定函数 围观:259℉更新时间:2014-10-29 function function_deep($function,$value) { try { if(!fu ...
- php数组的值转字符串,php 数组值怎么转字符串
在php中可以通过implode函数将php数组值转为字符串,其语法是"implode(separator,array)",其中参数separator规定数组元素之间放置的内容. ...
- php文件夹下所有图片加水印软件,PHP经典的给图片加水印程序
PHP经典的给图片加水印程序 更新时间:2006年12月06日 00:00:00 作者: /**************************************************** ...
- python遍历数组的两种方法加条件输出数组的值
第一种方法 1.通过for in遍历数组. 其实本质就是取出来的是这个数组或者列表中的元素,和角标无关. for predict_scores in predict_scores:print(pred ...
最新文章
- pfsense 2.2RC版本应用
- eplan怎样创建和修改图框_EPLAN标题页及图框的设计
- 统计数据:Google排名高的是什么样的页面?
- while语句 ///do...while语句/// for语句/// foreach语句
- 全自动抠图换背景软件下载_抠图换背景的证件照软件
- R 语言从Github上安装R语言的程序包
- 通达信资金净流入公式_净流入副图源码指标 通达信 贴图
- 学习帮——提高智商、改善记忆力的120种绝佳方法!
- python 趋势跟踪算法_DualThrust区间突破策略Python版
- 微信小程序:事件传参
- SPSS学习(三)可靠性(用α系数衡量)
- matlab一元方差分析方法,多元方差分析matlab程序.doc
- 互联网+脑科学,中国脑计划的机会
- linpack环境搭建:Openmpi+Openblas+HPL安装教程
- 电脑开不了机是不是电源坏了
- 将大文件 分卷 压缩
- python npv 计算公式_PMP知识点总结 -- 净现值(NPV)
- QML控件--MenuBar
- Android Studio代码检查lint使用
- java 语言程序设计 李尊朝 第12章 Swing 组件
热门文章
- 什么是堆,栈,内存泄漏和内存溢出?
- 通过 SSH 连接到 VMware NAT 模式下的 Ubuntu 虚拟机环境
- java如何爬取304_HTTP 304错误的详细讲解
- ios 侧滑返回停顿_iOS push侧滑返回功能实现方法
- 6a标准 api_【阀门标准】API SPEC 6A CHINESE-2010中文版.pdf
- 对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)
- java maven 读写pdf_Java 在PDF中加盖骑缝章
- 公办低分二本_山东的5所专科院校,属于本省公办,适合低分学生报考
- 秒过,度目智慧通行让常态化防疫更高效
- atomic原子类实现机制_Java并发包-atomic包-让您彻底掌握AtomicInteger源码