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+MySQL的聊天室设计
Oct 09 PHP
php 信息采集程序代码
Mar 17 PHP
php中显示数组与对象的实现代码
Apr 18 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
ThinkPHP实现动态包含文件的方法
Nov 29 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
PHP中抽象类和抽象方法概念与用法分析
May 24 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
搭建自己的PHP MVC框架详解
Aug 16 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
php获取网页上所有链接的方法
2015/04/03 PHP
js中更短的 Array 类型转换
2011/10/30 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
解析Python中的二进制位运算符
2015/05/13 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
Python多进程原理与用法分析
2018/08/21 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
经典的毕业生自荐信范文
2014/04/14 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
2015年新教师工作总结
2015/04/28 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle