php引用返回与取消引用的详解


Posted in PHP onJune 08, 2013

一、引用返回
引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法:

<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;                // prints the new value of $obj->value, i.e. 2.
?>

以上是PHP Manual给出的解释并表示太好理解
<?php
    function &test(){
     static $b = 0;  //声明一个静态变量
     $b = $b+1;
     echo $b."<br>";
     return $b;
    }
   $a = test();  //输出 $b 的值为:1
   $a = 5;
   $a = test();  //输出 $b 的值为:2   $a = &test();  //输出 $b 的值为:3  **注意**
   $a = 5;    //$b的值变为了5
   $a = test();  //输出 $b 的值为:6  **注意**
   ?>

$a = test() 虽然说函数定义的时候,是引用返回方式,但是如果采用这种普通形势调用函数,那它的作用也就和普通的函数一样,所以看结果就是1、2

$a = &test() 这种调用方式就是引用返回,就类似于 $a = &$b ,然后第二句又把$a = 5,那就是等于将变量$b = 5,最后一句得到的6也就很容易理解了!
和参数传递不同,这里必须在两个地方都用 & 符号——指出返回的是一个引用,而不是通常的一个拷贝,同样也指出 $a 是作为引用的绑定,而不是通常的赋值。

Note: 如果试图这样从函数返回引用:return ($this->value);,这将不会起作用,因为在试图返回一个表达式的结果而不是一个引用的变量。只能从函数返回引用变量——没别的方法。如果代码试图返回一个动态表达式或 new 运算符的结果,自 PHP 4.4.0 和 PHP 5.1.0 起会发出一条 E_NOTICE 错误。

二、取消引用
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

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

不会 unset $b,只是 $a。
再拿这个和 Unix 的 unlink 调用来类比一下可能有助于理解。
PHP 相关文章推荐
php预定义常量
Dec 25 PHP
Windows7下PHP开发环境安装配置图文方法
May 20 PHP
PHP下常用正则表达式整理
Oct 26 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
PHP字符串word末字符实现大小写互换的方法
Nov 10 PHP
php中JSON的使用方法
Apr 30 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 09 PHP
PHP stripos()函数及注意事项的分析
Jun 08 #PHP
php自动加载机制的深入分析
Jun 08 #PHP
深入理解curl类,可用于模拟get,post和curl下载
Jun 08 #PHP
coreseek 搜索英文的问题详解
Jun 08 #PHP
探讨如何在php168_cms中提取验证码
Jun 08 #PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 #PHP
基于php常用正则表达式的整理汇总
Jun 08 #PHP
You might like
深入分析php之面向对象
2013/05/15 PHP
PHP链表操作简单示例
2016/10/15 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
Git命令之分支详解
2021/03/02 PHP
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python中防止sql注入的方法详解
2017/02/25 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
python十进制转二进制的详解
2020/02/07 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
世界上最大的二手相机店:KEN
2017/05/17 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
中西医专业毕业生职业规划书
2014/02/24 职场文书
中药专业自荐信范文
2014/03/18 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
导游词之南京中山陵
2019/11/27 职场文书