- 浏览: 3319470 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (567)
- Web前端-html/表单 (19)
- Web前端-CSS (24)
- Web前端-CSS框架 (4)
- Web前端-JS语言核心 (50)
- Web前端-JS客户端 (26)
- nodejs生态+grunt (10)
- seajs和requirejs (9)
- backbone等框架 (7)
- 模板基础 (7)
- Web前端-deps(不改动) (6)
- Web前端-component (10)
- Web前端-jquery-plugin (13)
- 浏览器兼容性 (6)
- Web前端-使用jQuery (25)
- Web前端-使用jqueryui (6)
- Web前端-性能优化 (3)
- Web协议-HTTP (6)
- ExtJS (13)
- PHP (22)
- PHP面向对象 (4)
- PHP扩展-SOAP (6)
- PHP扩展-curl (4)
- PHP与HTML(导出) (5)
- PHP扩展-综合 (7)
- mysql基础应用 (18)
- 技术心情 (18)
- 算法和面试题 (17)
- 工具(开发)使用 (36)
- memcached原理 (2)
- session和cookie (4)
- UML (2)
- Web前端_FusionCharts (5)
- Web前端_Flex (4)
- Web前端_JSP (3)
- JavaSE (10)
- JavaEE (4)
- tomcat (2)
- Servlet开发 (3)
- Spring开发 (1)
- REST相关 (2)
- 大访问量、高并发 (2)
- 网络编程 (1)
- YII (21)
- linux命令和内核 (12)
- yii与数据库 (10)
- yii与表单 (12)
- yii view层 (1)
- perl (7)
- yii扩展 (7)
- shell (4)
- photoshop (7)
- 视觉设计 (2)
- 我关注的名人在路上 (4)
- 1-自学能力 (1)
- 2-人际沟通能力 (3)
- 3-职业规划能力 (7)
- 4-项目管理能力 (2)
- python (3)
- django (4)
- Mysql高级应用 (6)
- prototype.js (4)
- Web系统安全 (1)
- Web前端-mobile (2)
- egret (6)
- jQuery源码分析 (5)
- fis (4)
最新评论
-
yzq21056563:
感谢作者分享~请教下,http://www.lisa33xia ...
CSS基础:text-overflow:ellipsis溢出文本 -
u012206458:
$.ajax的error,complete,success方法 -
DEMONU:
谢谢,虽然不能给你赞助,但是要给你顶
mysql中key 、primary key 、unique key 与index区别 -
njupt_tolmes:
阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿凡达阿滕庆亚 ...
CSS基础:text-overflow:ellipsis溢出文本 -
zenmshuo:
用过SpreadJS,也包含数据可视化的图表
推荐几个web中常用js图表插件
这个陷阱在PHP里存在很久了,先看代码:
<?php
$array = array(1, 2, 3);
foreach ($array as &$v) {}
foreach ($array as $v) {}
print_r($array);
?>
运行代码,得到的结果却是:
Array
(
[0] => 1
[1] => 2
[2] => 2
)可以发现,经过两次foreach后,最后一个元素由3变成了2。
为什么会这样呢?这是因为第一次foreach的时候$v成为了一个引用变量($array[2]),如此,当第二次foreach的时候,实际上只是在对这个引用变量($array[2])进行了若干次赋值而已。
第一次:$array[2] = 1,此时$array各元素分别为1,2,1
第二次:$array[2] = 2,此时$array各元素分别为1,2,2
第二次:$array[2] = 2,此时$array各元素分别为1,2,2
一不小心很可能会掉入这个陷阱,为了避免这个问题,需要在第一次foreach后执行unset($v),解决方案有点丑陋,但也没有办法,PHP脚本里的变量一旦生成就在整个脚本中有效,不像Java中,变量是块级别的,仅仅在对应的{}中有效。
PHP的Bug系统里能看到关于这个这个问题的链接,不过从04年提出这个问题到现在已经四年了,估计PHP团队不会解决这个问题了。也是,从PHP的脚本特性来说这也可以说不是Bug,只是苦了我们这些程序员,要多加小心了。
<?php
$array = array(1, 2, 3);
foreach ($array as &$v) {}
foreach ($array as $v) {}
print_r($array);
?>
运行代码,得到的结果却是:
Array
(
[0] => 1
[1] => 2
[2] => 2
)可以发现,经过两次foreach后,最后一个元素由3变成了2。
为什么会这样呢?这是因为第一次foreach的时候$v成为了一个引用变量($array[2]),如此,当第二次foreach的时候,实际上只是在对这个引用变量($array[2])进行了若干次赋值而已。
第一次:$array[2] = 1,此时$array各元素分别为1,2,1
第二次:$array[2] = 2,此时$array各元素分别为1,2,2
第二次:$array[2] = 2,此时$array各元素分别为1,2,2
一不小心很可能会掉入这个陷阱,为了避免这个问题,需要在第一次foreach后执行unset($v),解决方案有点丑陋,但也没有办法,PHP脚本里的变量一旦生成就在整个脚本中有效,不像Java中,变量是块级别的,仅仅在对应的{}中有效。
PHP的Bug系统里能看到关于这个这个问题的链接,不过从04年提出这个问题到现在已经四年了,估计PHP团队不会解决这个问题了。也是,从PHP的脚本特性来说这也可以说不是Bug,只是苦了我们这些程序员,要多加小心了。
发表评论
-
php从5.2升级到5.4
2013-04-24 16:45 6372作者:zccst 现在已有lamp环境,只是php从5.2升 ... -
php文件操作
2012-05-23 19:34 1214作者:zccst 文件操作一直是我的弱项,在使用Java开发 ... -
php性能(内存)问题
2012-05-03 23:50 1140作者:zccst 遇到这样一个问题 $retArr = a ... -
php函数参数引用调用
2012-05-03 19:50 1758作者:zccst 一、参数的两种调用方式 1,传值调用 2 ... -
PHP开发经验总结
2012-04-27 15:19 1745zccst整理(待续) 1.使用内嵌的HTML代码,而不是P ... -
call_user_func_array和call_user_func函数的用法
2012-04-27 15:15 1984zccst转载 下面来和大家 ... -
PHP异常处理
2012-03-24 19:55 1896作者:zccst 一、基本用法 Exception()方法 ... -
php与http(php预定义变量)
2012-02-28 14:04 1354var_dump($_SERVER['REQUEST_URI' ... -
php设置环境变量
2012-01-25 11:40 948实例: $g_config['root'] =dirnam ... -
php5中const、define和static
2011-12-08 10:44 9966一、const 在编程中,我们一般用常量来定义那些在运行时不能 ... -
php上传文件的5种方式
2011-11-20 22:55 4948作者:zccst 一、普通文 ... -
PHP:实现给上传图片加水印的程序代码
2011-11-17 21:17 1302用PHP给上传图片加水印的程序是通过判断文件类型建立图形,然后 ... -
PHP之重要函数
2011-11-04 20:16 1427积少成多——作者:zccst 10,判断必须是整数和是否是 ... -
PHP之类
2011-09-09 18:21 1116关于类的函数 一、与Java相同的类知识 1,类和对象 公有 ... -
PHP之字符串函数
2011-09-07 17:51 1123作者:zccst 2,大小写转换 strtoupper() ... -
PHP调试及代码注释
2011-08-30 14:07 1229一、调试 PHP调试不同于Java 1,常用调试方法: e ... -
PHP之数组
2011-08-04 16:03 1383作者:zccst 5,array_merg ... -
PHP——日期和时间
2011-07-05 14:56 12891,PHP获取当前时间。 ... -
PHP之数组foreach,join
2011-06-08 19:12 2853一,foreach的使用 例如:$arr = array(&q ... -
php之mysql操作
2011-05-18 11:08 1259一、连接,插入,查询 <?php $con = mys ...
相关推荐
然而,当我们在`foreach`循环中使用引用变量时,可能会遇到一些陷阱,导致意料之外的结果。本文将深入探讨这个问题,并提供解决方案。 首先,我们要理解PHP中的引用。在PHP中,引用并不是创建了一个新变量,而是让...
在上述例子中,作者通过两个数组($arr和$arr2)演示了在foreach循环中使用引用的可能陷阱。第一个foreach循环向数组元素添加字符串"4"。如果没有在循环后断开引用,那么第二个foreach循环遍历第二个数组($arr2)时,...
当我们在`foreach`循环中使用`foreach ($arr as &$value)`这样的语法时,我们实际上是在以引用的方式处理数组元素,而非简单的值复制。本文将深入探讨这种用法的原理、优缺点以及适用场景。 首先,理解引用的概念至...
JavaScript性能优化是每个开发者在编写高效代码时必须关注的关键领域。由于JavaScript的动态特性,一些编程习惯可能导致不必要的性能损耗。以下是一些常见的JavaScript性能陷阱及其优化建议: 1. **避免使用`eval`...
- 使用`foreach`遍历数组时,可以获取当前元素的键和值,但要注意不要混淆数组的引用和复制。 - 如果数组可能为空,应在循环前检查其长度,以防止空数组导致的错误。 通过理解这些常见问题和解决方案,你可以更...
.NET Gotchas是一个广泛使用的术语,指的是在开发.NET应用程序时可能会遇到的陷阱或意外情况。这些gotchas通常是由于对.NET框架不完全理解或者某些隐藏的行为所导致的问题。在深入探讨.NET Gotchas之前,让我们先...
在这种情况下,通过在foreach中使用引用符号"&",确保每次迭代时,bindParam都得到正确的变量引用。但这种方法容易引起混淆,不建议在一般情况下使用。 总之,理解bindParam的工作机制至关重要,特别是它对引用...
6.6 foreach循环的循环计数器 6.7 小结 第7课 面向对象的陷阱 7.1 instanceof运算符的陷阱 7.2 构造器的陷阱 7.2.1 构造器之前的void 7.2.2 构造器创建对象吗 7.2.3 无限递归的构造器 7.3 持有当前类的实例...
•当使用foreach循环来迭代输出数组元素或集合时,通常不要对循环变量进行赋值,虽然这种赋值在语法上是允 许的,但没有太大的意义,而且极容易引起错误。 深入数组 •数组元素和数组变量在内存里是分开...
- **问题**:公式计算可能在读取或写入时出错,特别是在处理跨表引用和复杂公式时。 - **解决**:使用`FormulaEvaluator`类来评估公式,确保公式在写入前正确计算,同时注意跨表引用的处理。 5. **行和列的遍历**...
使用`foreach`循环时,系统会自动管理枚举器的生命周期,但手动创建枚举器时需谨慎。 4. **资源管理**:非托管资源(如文件句柄、数据库连接等)必须正确释放,以防止内存泄漏。使用`using`语句可以简化资源清理。 ...
为了解决这个问题,可以在`ClickHandler`内部使用一个变量(例如`self`)来保持对`MyObject`实例的引用。 **评点**:理解`this`的作用域对于避免此类陷阱至关重要。此外,现代JavaScript提供了箭头函数等特性,它们...
在使用Velocity时,你需要创建一个Velocity上下文(Context),在这个上下文中添加你想要在模板中访问的对象。然后,通过Velocity模板引擎将这个上下文和模板文件合并,生成最终的输出。Velocity引擎会自动处理对象的...
然而,由于JavaScript的异步性质和作用域链机制,循环结束时,所有事件处理函数都将引用同一个循环变量的最终值,而不是它们在循环中的各自值。这就是所谓的闭包问题。 要解决这个问题,有几种常见的方法: 1. **...
3. **利用`yield return`进行迭代**:在C#中,`yield return`允许在遍历集合时创建一个迭代器,无需一次性计算所有元素,从而提高性能和内存效率。 4. **理解`null`和`Nullable<T>`**:C#中的`null`是引用类型的...
- **Chapter 12**:自动化任务时的常见陷阱。 - **Chapter 13**:安全性和权限方面的错误指导。 - **附录错误**:对附录中可能存在的错误进行说明。 - **读者问题解答与附加材料** - **评论语法在 PowerShell ...
反射允许在运行时检查和修改对象的结构和行为,但在频繁使用时可能导致性能下降。应谨慎使用反射,仅在必要时采用,并考虑其对性能的影响。 #### 25. 模块化设计,遵循单一职责原则 将程序分解为多个独立的模块,...
10. **Type Annotations**:Java 8增加了类型注解,可以在类型使用的地方(如参数、返回值、字段等)添加注解,用于编译时或运行时的类型检查。 以上这些特性使得Java 8在功能、性能和开发体验上都有了显著提升,...
4. **模板语法**:包括变量引用($var)、占位符(#{expr})、条件语句(#if, #else, #elseif)、循环结构(#foreach)以及宏定义和调用等。 5. **Struts与Velocity的集成**:Struts是一个MVC框架,而Velocity是...