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中判断字符串是否全是中文或含有中文的实现代码
Sep 16 PHP
PHP采集腾讯微博的实现代码
Jan 19 PHP
解析yii数据库的增删查改
Jun 20 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
php去除字符串换行符示例分享
Feb 13 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
PHP中函数gzuncompress无法使用的解决方法
Mar 02 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 PHP
解析laravel使用workerman用户交互、服务器交互
Apr 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
Zend Guard使用指南及问题处理
2015/01/07 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JsDom 编程小结
2011/08/09 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
Python如何实现守护进程的方法示例
2017/02/08 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
市场部管理制度
2014/02/02 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
2014年评职称工作总结
2014/11/20 职场文书
任命书格式范文
2015/09/22 职场文书