php中引用符号(&)的使用详解


Posted in PHP onNovember 13, 2013

与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址变量的引用.
PHP 的引用允许你用两个变量来指向同一个内容

$a="ABC"; 
$b =&$a; 
echo $a;//这里输出:ABC 
echo $b;//这里输出:ABC 
$b="EFG"; 
echo $a;//这里$a的值变为EFG 所以输出EFG 
echo $b;//这里输出EFG

函数的传址调用
传址调用我就不多说了 下面直接给出代码
function test(&$a) 
{ 
$a=$a+100; 
} 
$b=1; 
echo $b;//输出1 
test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 
echo "<br>"; 
echo $b;//输出101

要注意的是,在这里test(1);的话就会出错,原因自己去想
函数的引用返回
先看代码
function &test() 
{ 
static $b=0;//申明一个静态变量 
$b=$b+1; 
echo $b; 
return $b; 
} $a=test();//这条语句会输出 $b的值 为1 
$a=5; 
$a=test();//这条语句会输出 $b的值 为2 
$a=&test();//这条语句会输出 $b的值 为3 
$a=5; 
$a=test();//这条语句会输出 $b的值 为6

下面解释下: 
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
PHP规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂
用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中
对象的引用
class a{ 
var $abc="ABC"; 
} 
$b=new a; 
$c=$b; 
echo $b->abc;//这里输出ABC 
echo $c->abc;//这里输出ABC 
$b->abc="DEF"; 
echo $c->abc;//这里输出DEF

以上代码是在PHP5中的运行效果
在PHP5中 对象的复制 是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP定义了一个特殊的方法,称为__clone.
引用的作用
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。
取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
$a = 1; 
$b =& $a; 
unset ($a);

不会 unset $b,只是 $a。
global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:
$var =& $GLOBALS["var"]; 

这意味着,例如,unset $var 不会 unset 全局变量。
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。
//下面再来个小插曲
php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
通俗的讲
1:如果有下面的代码
$a="ABC"; 
$b=$a;

其实此时 $a与$b都是指向同一内存地址 而并不是$a与$b占用不同的内存 2:如果在上面的代码基础上再加上如下代码
$a="EFG";

由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储
PHP 相关文章推荐
ASP和PHP都是可以删除自身的
Apr 09 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
PHP学习之整理字符串
Apr 17 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
四个PHP非常实用的功能
Sep 29 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 PHP
使用php验证复选框有效性的示例
Nov 13 #PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 #PHP
php curl模拟post请求小实例
Nov 13 #PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 #PHP
php模板原理讲解
Nov 13 #PHP
php构造函数实例讲解
Nov 13 #PHP
PHP将XML转数组过程详解
Nov 13 #PHP
You might like
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
使用python解析xml成对应的html示例分享
2014/04/02 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
python做反被爬保护的方法
2019/07/01 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
信息与计算科学专业推荐信
2014/02/23 职场文书
食品安全承诺书
2014/05/22 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
党员评议个人总结
2014/10/20 职场文书
党支部先进事迹材料
2014/12/24 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript