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


Posted in PHP onDecember 12, 2016

本文实例分析了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 
?>

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

<?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规定传递的引用不能为常量(可以看错误提示)。

函数的引用返回 先看代码

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

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

'&' 这就是引用

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

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中引用&amp;的用法分析【变量引用,函数引用,对象引用】

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

PHP 相关文章推荐
PHP&amp;MYSQL服务器配置说明
Oct 09 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
解析posix与perl标准的正则表达式区别
Jun 17 PHP
深入file_get_contents与curl函数的详解
Jun 25 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
Laravel5中contracts详解
Mar 02 PHP
php实现的验证码文件类实例
Jun 18 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
PHP7新增函数
Mar 09 PHP
简单谈谈PHP中的Reload操作
Dec 12 #PHP
php的laravel框架快速集成微信登录的方法
Dec 12 #PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 #PHP
php+ajax+json 详解及实例代码
Dec 12 #PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 #PHP
Zend Framework数据库操作方法实例总结
Dec 11 #PHP
smarty模板数学运算示例
Dec 11 #PHP
You might like
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
js删除所有的cookie的代码
2010/11/25 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
Django 跨域请求处理的示例代码
2018/05/02 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
大学生入党思想汇报
2014/01/01 职场文书
教师个人剖析材料
2014/02/05 职场文书
高三英语复习计划
2015/01/19 职场文书
英文慰问信范文
2015/03/24 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
党员公开承诺书2016
2016/03/24 职场文书
Linux中各个目录的作用与内容
2022/06/28 Servers