PHP引用符&的用法详细解析


Posted in PHP onAugust 22, 2013

关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。

<?php  
 $a = 100; //声明变量a  
 $b = &$a; //声明变量b,引用自变量a  
 echo "$a <br />";    
 echo "$b <br />";  
 $a++; //变量a自增1  
 echo "$a <br />";  
 echo "$b <br />";//查看变量b,也增加了1,说明使用的是同一存储单元  
 ?>

程序运行结果:
100   
100   
101   
101

很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

php默认为传值传递:

<?php      
 $a = 20;  
 $b = $a;  
 $a = $a + 10;   
 echo $a.' and '.$b;   
 ?>

程序运行结果:
30 and 20

要是想变为地址传递需要加&,既:
<?php  
 $a = 20;  
 $b = &$a;   
 $a = $a + 10;   
 echo $a.' and '.$b;   
 ?>

程序运行结果:
30 and 30

也就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:

 <?php  
 $bar =& new fooclass();  
 $foo =& find_var($bar);  
 ?>

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:
 <?php  
 function foo(&$val1, $val2) {  
     $val1 += 1;  
     $val2 += 1;  
 }  
 $a=5;  
 $b=10;  
 foo($a,$b);  
 echo $a;  
 echo $b;  
 ?>

运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。

PHP引用的第三个用法是引用返回,这个用法理解起来有点难度,引用返回用在当你想用函数找到引用应该被绑定在哪一个变量上面时。当返回引用时,使用此语法:说的简单点,就还是引用函数的返回。但和参数传递不同,必须在函数定义和函数引用这两个地方都用 & 符号。下面举个例子:

 <?php  
 function &find_var ($param)  
 {  
     /* ...code... */ 
     return $found_var;  
 }  
 $foo =& find_var ($bar);  
 $foo->x = 2;  
 ?>

这个例子给$foo 赋值是函数find_var的返回引用,所以在给$foo->x赋值时就是给find_var的返回引用赋值,而不是简单的赋值。

PHP引用的最后一个用法是引用定位,主要有两个应用:一个是global 引用,当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是和$var =& $GLOBALS["var"];是一样的。另外一个是$this的用法,在一个对象的方法中,$this 永远是调用它的对象的引用。

PHP 相关文章推荐
php中文本数据翻页(留言本翻页)
Oct 09 PHP
一个SQL管理员的web接口
Oct 09 PHP
php cookies中删除的一般赋值方法
May 07 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
php调用google接口生成二维码示例
Apr 28 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
推荐十款免费 WordPress 插件
Mar 24 PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 PHP
php 数据结构之链表队列
Oct 17 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
Jun 19 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 #PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 #PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 #PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 #PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 #PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 #PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 #PHP
You might like
用Php实现链结人气统计
2006/10/09 PHP
PHP的FTP学习(一)
2006/10/09 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
基于jquery封装的一个js分页
2011/11/15 Javascript
js函数调用的方式
2014/05/06 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Django框架视图函数设计示例
2019/07/29 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
学生会竞选自荐信
2013/10/12 职场文书
农村改厕实施方案
2014/03/22 职场文书
办公室文员岗位职责
2015/02/04 职场文书
名人传读书笔记
2015/06/26 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android