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获取某个目录大小的代码
Sep 10 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
Oct 30 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
浅谈如何提高PHP代码质量之端到端集成测试
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简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
jquery 学习之二 属性(类)
2010/11/25 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
React中的render何时执行过程
2018/04/13 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
Python3中的2to3转换工具使用示例
2015/06/12 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python3中的bytes和str类型详解
2019/05/02 Python
python十进制转二进制的详解
2020/02/07 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
商场端午节活动方案
2014/01/29 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
大学辅导员述职报告
2015/01/10 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers