当前位置:首页 > 日记 > 正文

php中引用&的用法分析【变量引用,函数引用,对象引用】

php中引用&的用法分析【变量引用,函数引用,对象引用】

本文实例分析了php中引用&的用法。分享给大家供大家参考,具体如下:

php的引用(就是在变量或者函数、对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁

在PHP 中引用的意思是:不同的名字访问同一个变量内容.

变量的引用

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

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

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

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

要注意的是,在这里test(1);的话就会出错,原因是:PHP规定传递的引用不能为常量(可以看错误提示)。

函数的引用返回 先看代码

<?phpfunction &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

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

对象的引用

<?phpclass 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 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

<?php $a = 1; $b =& $a; unset ($a); ?>

不会 unset $b,只是 $a。 function quoteTest(){ global $var ; //相当于 $var = &$GLOBALS['var']; unset($var); //删除只是删除引用,而引用的内容还存在,同上这并不意味着变量内容被销毁了}$var=1;quoteTest();echo $var; //  结果 1

不会 unset $b,只是 $a。

function quoteTest(){ global $var ; //相当于 $var = &$GLOBALS['var']; $var = 5; //因为他们都指向 同一内存内容}$var=1;quoteTest();echo $var; //结果 5

'&' 这就是引用

global 引用 当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

<?php $var =& $GLOBALS["var"]; ?>

这意味着,例如,unset $var 不会 unset 全局变量。

$this 在一个对象的方法中,$this 永远是调用它的对象的引用。

下面再来个小插曲 php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲

1. 如果有下面的代码 [php] $a="ABC"; $b=$a; [/php] 其实此时 $a与$b都是指向同一内存地址 而并不是$a与$b占用不同的内存

2. 如果在上面的代码基础上再加上如下代码 [php] $a="EFG"; [/php] 由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php常用函数与技巧总结》、《php面向对象程序设计入门教程》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php正则表达式用法总结》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

相关文章

PPT中如何给照片添加胶带粘贴的效

PPT中如何给照片添加胶带粘贴的效

照片,胶带,效果,电脑软件,PPT,  ppt中想要给照片制作一种效果,PPT给照片添加胶带粘贴的效果,该怎么制作。以下是小编为您带来的关于PPT给照片添加胶带粘贴的效果,希望对您有所帮助。PPT给照片添加胶带粘贴的效果1、新建一个PPT,并打开(为了方…

怎么在Word2007保护自己的文档使用

怎么在Word2007保护自己的文档使用

文档,自己的,隐私,电脑软件,  有时候,出于隐私保护的需求,我们不想让同样使用这个word的人看到,就需要清除word这些记录。以下是小编为您带来的关于在Word2007保护自己的文档使用隐私,希望对您有所帮助。在Word2007保护自己的文档使用隐私以…

详解HTTPS 的原理和 NodeJS 的实现

详解HTTPS 的原理和 NodeJS 的实现

详解,原理,电脑软件,HTTPS,NodeJS,基本原理HTTP协议采用明文传输数据,当涉及敏感信息的传送时,极有可能会受到窃听或者中间人的攻击。HTTPS是HTTP与SSL/TLS的组合,即使用加密通讯以及网络服务器的身份鉴定来进行信息的安全传输。其核心有二:使…

iis7中CFCA客户端登录报403错误已

iis7中CFCA客户端登录报403错误已

客户端,错误,登录,电脑软件,CFCA,先简单说下原理大概原理: 采用SSL,在用户使用浏览器访问WEB服务器时,会在客户端和服务器建立安全SSL通道。在SSL会话产生时: 第一步 服务器会传送它的服务器证书,客户端会自动的分析服务器证书,来验证服务器的身…

excel表格加法计算同列数值的教程

excel表格加法计算同列数值的教程

教程,计算,加法,数值,表格,  Excel如何利用加法计算同列数值呢?下面是小编带来的关于excel表格加法计算同列数值的教程,希望阅读过后对你有所启发!excel表格加法计算同列数值的教程:  加法计算同列步骤1:首先打开EXCEL表格加法计算同列步…

Windows安装Node.js报错:2503、250

Windows安装Node.js报错:2503、250

解决方法,安装,报错,电脑软件,Windows,前言Windows真的是太恶心了!!!不仅会出现大量的垃圾文件,而且有时莫名的安装不上一些软件(正常软件)。前久因为想学学Koa2,打算升级下nodejs的版本以体验下ES6、ES7的aync,await等新特性,却死活安装不上nodejs…

windows 2003服务器系统盘空间不足

windows 2003服务器系统盘空间不足

空间,服务器,系统盘,解决方法,电脑软件,  最近发现网速很慢,图片也都找不到,打开服务器显示C盘空间不足(剩余不到20M),查找原因后发现:默认情况下,2003服务器会把所有IIS访问错误的记录写入 C:WINDOWS/system32/LogFiles 下的 log 文件中,如果访…

解决AngualrJS页面刷新导致异常显

解决AngualrJS页面刷新导致异常显

显示,页面刷新,电脑软件,AngualrJS,绪 俗话说,细节决定成败,编程亦是如此。编程过程中我们可能会不自觉的忽视一些细节问题,殊不知,这些细节正是导致页面显示出现问题的地方。今略举一例,与君共勉之。页面正常加载后,显示如下:按F5刷新之后,页面…

ps如何绘制石头?PS简单绘制一块写实

ps如何绘制石头?PS简单绘制一块写实

绘制,教程,石头,简单,电脑软件,下面的教程将教的Photoshop入门实例学习者使用PS简单绘制一块平淡无奇的石头,教程难度一般,绘制出来的石头比较逼真,带点写实的感觉。教程主要介绍的质感的刻画和体现,希望对的朋友们学习PS和设计有所帮助。我们…

PHP采用超长 | 超大数字运算防止数

PHP采用超长 | 超大数字运算防止数

数字,运算,显示,科学计数法,方法,本文实例讲述了PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法。分享给大家供大家参考,具体如下:PHP计算大数值运算时会出错,当数字太大时,数值会变成科学计数.那怎么来进行PHP超大数值运算,包括…

JavaScript中各数制转换全面总结

JavaScript中各数制转换全面总结

数制转换,电脑软件,JavaScript,利用toString的基模式来进行转换:ECMAScript对数字类型的toString描述如下:Number 类型的 toString() 方法比较特殊,它有两种模式,即默认模式和基模式。采用默认模式,toString() 方法只是用相应的字符串输出数字值…

ppt2016如何截图

ppt2016如何截图

截图,电脑软件,一般来讲,截图需要专业的截图软件来完成,但前提得下载并安装专业的截图软件,非常麻烦。那有朋友可能会说,使用QQ截图了,非常方便,但是,当我们电脑断网时,怎么办?这时候,当然是用PowerPoint 软件自带「屏幕截图」功能啦!方法:选择【插入…