从一道面试题开始
在开始本节内容前,我们先来看看一道还算比较常见的PHP面试题:
1 |
$arr = array('1','2','3'); |
猜一下,运行的结果会是什么呢?熟悉PHP的同学可能已经知道结果了:
2 |
0 => string '1' (length=1) |
3 |
1 => string '2' (length=1) |
4 |
2 => &string '2' (length=1) |
是引用在捣鬼
那么为什么是1,2,2呢。让我们一步步来看:
我们知道对数组执行foreach循环时,是通过移动数组内部指针来实现的。对于上面的例子:当foreach循环结束的时候,由于$v为引用变量,所以$v 与 $arr[ 2 ] 指向了同一个地址空间(共享变量值),之后对$v的任何修改都会直接反映到数组$a中。
要不我们在程序中加入调试代码,看看运行过程的情况吧。
1 |
$arr = array('1','2','3'); |
程序运行的结果是:
02 |
0 => string '1' (length=1) |
03 |
1 => string '2' (length=1) |
04 |
2 => &string '1' (length=1) |
07 |
0 => string '1' (length=1) |
08 |
1 => string '2' (length=1) |
09 |
2 => &string '2' (length=1) |
12 |
0 => string '1' (length=1) |
13 |
1 => string '2' (length=1) |
14 |
2 => &string '2' (length=1) |
简单解释一下:
- 在第一次 foreach 循环里面,$v 是个引用。在循环结束之后,$v 与 $arr[2] = 3,指向了同一个内存块;
- 紧接着第二次循环,$v 引用并没有改变,还是$arr[2]的引用,这时 $v 值是 $arr[0] 的值,所以导致 $arr[2] = 1;
- 同上面,$v 已被 $arr[1] 影响,其值为 2,导致 $arr[2] = 2;
- 所以最终结果是 1, 2, 2.
关于引用,你需要了解的
1. 引用类似于指针,但是不同于指针。
下面的操作让 $a 和 $b 指向了同一个内存块,值为 “str”
试下更改$a和$b中任何一个元素的值。另外一个值都为随之改变:
4 |
$b = "www.nowamagic.net"; |
程序运行结果为:
2. 引用作为函数参数传递时,是可以被函数内部更改的:
05 |
$a = "www.nowamagic.net"; |
程序运行结果为:
3. unset只会删除变量。并不会清空变量值对应的内存空间:
程序运行结果为:
2 |
Notice: Undefined variable: b |
- CentOS磁盘用完的解决办法,以及Tomcat的server.xml里无引用,但是项目仍启动的问题
这是我2018年的第一篇博客...人真是懒了啊...最近在写微信小程序,觉得小程序做的也... 好了不吐槽了,言归正传 前言: 由于我之前不是买了个三年的香港服务器么 , 之前广州2的服务器我就没有续 ...
- foreach里的按引用传值问题
1.foreach($arr as $k=>&$v){ } 这样循环时候最后一个结果前边会有&,出现输出不了的情况,这时候只需要加一个unset($v),加在循环里和外均可. 2 ...
- <c:if>判断两个<c:forEach>里的数据是否相等
问题:两个<c:forEach>嵌套,里面循环的值和外面的值进行比较(里层里的PARENTID是否等于外层的ID),如果相等就显示. <c:forEach items="$ ...
- [PHP] foreach循环的引用赋值可能导致的问题
foreach($arr as &$value)1.引用赋值符号&,是每次循环的时候,把当前元素变成地址,$value变量就是对应元素的地址,循环结束$value是一个指向最后一个元素 ...
- php在foreach中使用引用赋值&可能遇到的问题(转)
楼主在写项目的时候,由于初涉PHP的赋值引用操作,觉得这个功能非常强大,用时一时爽,没有深入了解过其中的原理,导致了一些当时觉得不可思议的BUG,废话不都说,我举个例子详细的描述一下这个问题. 代码: ...
- Python里的引用与拷贝规律
python的可变不可变与各种浅拷贝深拷贝规则,一并梳理. Python一切皆引用 在C++/Java里,int a = 1就是创建变量为a,赋值为1:int b = a就是创建变量b,赋值为a的值. ...
- jsp页面中从forEach里向action里面传递其中的一个对象
<c:forEach var="user" items="${users }"> <form action="user_update ...
- 如何获取c:forEach里面点击时候的值
1.c:forEach遍历输出 <c:forEach items="${data}" var="item" > <a onclick=&quo ...
- 在mvc4里怎样引用:System.Web.Optimization和entityframework
请在nuget 里运行: Install-Package Microsoft.AspNet.Web.Optimizationinstall-package entityframework
随机推荐
- BeanUtils的日期问题
//注册日期类型转换器 //第一种 自定义方法 ConvertUtils.register(new Converter(){ //第一个参数是目标 ...
- Grnymotion模拟器和Android真机访问PC端Tomcat下的应用
最近因为要学安卓与服务器交互的知识,所以必须要让android程序能访问一个测试服务器.所以我就考虑让真机或者模拟器访问PC端的Tomcat或者Apache服务. 在介绍步骤之前,有必要说点基础的.我 ...
- 【Linux】常用命令
一.文件结构 /: 根目录 /bin: 系统所需要的那些命令位于此目录. /boot: Linux的内核及引导系统程序所需要的文件目录,GRUB或LILO系统引导管理器也 ...
- VS2010 release 和 debug 调试区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...
- MVC身份验证及权限管理
MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息.例如下面的配置信息: < ...
- 转:推荐!国外程序员整理的 C++ 资源大全
原文来自于:http://blog.jobbole.com/78901/ 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz 发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据 ...
- BZOJ 1015 星球大战
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- angular2 学习笔记 (Pipes)
Pipe 就是 ng1 的 filter <pre>{{ jsonValue | json }}</pre> 用法看这里就很清楚了 : https://angular.cn/d ...
- 浅析STL allocator
一般而言,我们习惯的 C++ 内存配置操作和释放操作是这样的: class FOO{}; FOO *pf = new FOO; delete pf; 我们看其中第二行和第三行,虽然都是只有一句,当是都 ...
- 快速创建php server
mkdir testmv test.html testphp -S localhost:8082http://localhost:8082/test.html