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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
PHP 文件系统详解
Sep 13 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
php多文件上传下载示例分享
Feb 20 PHP
php计算程序运行时间的简单例子分享
May 10 PHP
Zend Framework+smarty用法实例详解
Mar 19 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
浅谈PHPANALYSIS提取关键字
Mar 08 PHP
Laravel框架学习笔记之批量更新数据功能
May 30 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
综合图片计数器
2006/10/09 PHP
dedecms模板标签代码官方参考
2007/03/17 PHP
PHP mkdir()定义和用法
2009/01/14 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
关于Pycharm无法debug问题的总结
2019/01/19 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
服务生自我鉴定
2014/01/22 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
老人与海读书笔记
2015/06/26 职场文书
学生会任命书范本
2015/09/21 职场文书
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript