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 相关文章推荐
Windows中安装Apache2和PHP4权威指南
Nov 18 PHP
简单的php 验证图片生成函数
May 21 PHP
PHP 最大运行时间 max_execution_time修改方法
Mar 08 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 PHP
php动态变量定义及使用
Jun 10 PHP
ajax+php控制所有后台函数调用
Jul 15 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
PHP 自动加载的简单实现(推荐)
Aug 12 PHP
浅谈PHP中的Trait使用方法
Mar 22 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 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 用数组降低程序的时间复杂度
2009/12/04 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
关于JavaScript中string 的replace
2013/04/12 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
python实现银行账户系统
2021/02/22 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
毕业生怎样写好自荐信
2013/11/11 职场文书
资料员岗位职责
2013/11/17 职场文书
酒店人事专员岗位职责
2013/12/19 职场文书
考试不及格检讨书
2014/01/09 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
市场营销工作计划书
2014/05/06 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
趣味运动会口号
2015/12/24 职场文书
七年级数学教学反思
2016/02/17 职场文书