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中利用XML技术构造远程服务(下)
Oct 09 PHP
初探PHP5
Oct 09 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
一些需要禁用的PHP危险函数(disable_functions)
Feb 23 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
php处理复杂xml数据示例
Jul 11 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
php实现base64图片上传方式实例代码
Feb 22 PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 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连接数据库代码应用分析
2011/05/29 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
Jquery中dialog属性小记
2010/09/03 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
vue实现全选和反选功能
2017/08/31 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
python查询mysql中文乱码问题
2014/11/09 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
python时间time模块处理大全
2020/10/25 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
HTML5地理定位实例
2014/10/15 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
final, finally, finalize的区别
2012/03/01 面试题
消防安全责任书
2014/04/14 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
关于美容院的活动方案
2014/08/14 职场文书
消费者理赔投诉书
2015/07/02 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python