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 高手之路(三)
Oct 09 PHP
PHP 高手之路(一)
Oct 09 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
php中get_object_vars()方法用法实例
Feb 08 PHP
php遍历目录方法小结
Mar 10 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
CI框架简单邮件发送类实例
May 18 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
PHPMailer发送邮件
Dec 28 PHP
php传值方式和ajax的验证功能
Mar 27 PHP
php实现微信分享朋友链接功能
Feb 18 PHP
调试php程序的简单步骤
Oct 04 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与ASP
2006/10/09 PHP
php 无限级缓存的类的扩展
2009/03/16 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
详解javascript void(0)
2020/07/13 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
实现GO语言对数组切片去重
2022/04/20 Golang