php中引用符号(&)的使用详细介绍


Posted in PHP onDecember 06, 2016

与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址变量的引用.

PHP 的引用允许你用两个变量来指向同一个内容

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

函数的传址调用

传址调用我就不多说了 下面直接给出代码

<?php
function test(&$a) {
  $a = $a + 100;
}
$b = 1;
echo $b; //输出1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b; //输出101

?>

 要注意的是,在这里test(1);的话就会出错,原因自己去想

函数的引用返回

先看代码

<?php
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

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中

对象的引用

 

<?php
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";

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
php实现的简单压缩英文字符串的代码
Apr 24 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
PHP命名空间(Namespace)简明教程
Jun 11 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
php下载文件,添加响应头的简单实例
Sep 22 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 #PHP
thinkPHP自动验证机制详解
Dec 05 #PHP
thinkPHP中_initialize方法实例分析
Dec 05 #PHP
php版微信自定义回复功能示例
Dec 05 #PHP
thinkPHP中配置的读取与C方法详解
Dec 05 #PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
Dec 05 #PHP
thinkPHP js文件中U方法不被解析问题的解决方法
Dec 05 #PHP
You might like
使用php4加速网络传输
2006/10/09 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
php的debug相关函数用法示例
2016/07/11 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
详解nuxt 微信公众号支付遇到的问题与解决
2019/08/26 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
利用aardio给python编写图形界面
2017/08/21 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
python logging.info在终端没输出的解决
2020/05/12 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
超市店庆活动方案
2014/08/31 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
利用python做数据拟合详情
2021/11/17 Python
Python中time与datetime模块使用方法详解
2022/03/31 Python