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 相关文章推荐
UCenter Home二次开发指南
May 28 PHP
php 模拟get_headers函数的代码示例
Apr 27 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
PHP整合PayPal支付
Jun 11 PHP
php实现多城市切换特效
Aug 09 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
curl 出现错误的调试方法(必看)
Feb 13 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 PHP
零基础php编程好学吗
Oct 11 PHP
PHP RabbitMQ消息列队
May 11 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解析html的实现代码
2011/08/08 PHP
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python模块学习 datetime介绍
2012/08/27 Python
python文件写入实例分析
2015/04/08 Python
利用Python如何生成随机密码
2016/04/20 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
Python表达式的优先级详解
2020/02/18 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
英国标准协会商店:BSI Shop
2019/02/25 全球购物
化学专业毕业生自荐信
2013/11/15 职场文书
珍珠奶茶店创业计划书
2014/01/11 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
公司周年庆活动方案
2014/08/25 职场文书
信用卡工资证明范本
2015/06/19 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
解决xampp安装后Apache无法启动
2022/03/21 Servers