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 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
PHP下常用正则表达式整理
Oct 26 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
php文件操作实例代码
May 10 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
Linux中为php配置伪静态
Dec 17 PHP
简单谈谈php浮点数精确运算
Mar 10 PHP
PHP常用的三种设计模式汇总
Aug 28 PHP
详解thinkphp中的volist标签
Jan 15 PHP
YII框架http缓存操作示例
Apr 29 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
PHP 构造函数和析构函数原理与用法分析
Apr 21 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下实现伪 url 的超简单方法[转]
2007/09/24 PHP
PHP写MySQL数据 实现代码
2009/06/15 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
浅析jquery的作用与优势
2013/12/02 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
Python实现批量下载图片的方法
2015/07/08 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
Python错误的处理方法
2020/06/23 Python
python如何随机生成高强度密码
2020/08/19 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
小学音乐教学反思
2014/02/05 职场文书
个人安全承诺书
2014/05/22 职场文书
运动会宣传口号
2014/06/09 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript