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 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
php 用sock技术发送邮件的函数
Jul 21 PHP
PHP伪静态页面函数附使用方法
Jun 20 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
php+mysql数据库查询实例
Jan 21 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
YII使用url组件美化管理的方法
Dec 28 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 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
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
Python 抓取动态网页内容方案详解
2014/12/25 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
python的flask框架难学吗
2020/07/31 Python
Python打印不合法的文件名
2020/07/31 Python
产品工艺师的岗位职责
2013/11/15 职场文书
顶岗实习接收函
2014/01/09 职场文书
生产车间标语
2014/06/11 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
2014年超市工作总结
2014/11/19 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python