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中在数据库中保存Checkbox数据(1)
Oct 09 PHP
利用PHP动态生成VRML网页
Oct 09 PHP
php 过滤器实现代码
Aug 09 PHP
php的memcached客户端memcached
Jun 14 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
php生成唯一的订单函数分享
Feb 02 PHP
php压缩和解压缩字符串的方法
Mar 14 PHP
php需登录的文件上传管理系统
Mar 21 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 PHP
PHP中trait使用方法详细介绍
May 21 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 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 serialize()与unserialize()的用法
2013/06/05 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
详解Django通用视图中的函数包装
2015/07/21 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
如何在python中写hive脚本
2019/11/08 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
教育系毕业生中文求职信范文
2013/10/06 职场文书
大学生职业生涯规划范文
2014/01/08 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
班主任先进事迹材料
2014/12/17 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
教师反邪教心得体会
2016/01/15 职场文书
python基础之停用词过滤详解
2021/04/21 Python