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 相关文章推荐
如何将数据从文本导入到mysql
Oct 09 PHP
PHP 字符串正则替换函数preg_replace使用说明
Jul 15 PHP
php和jquery实现地图区域数据统计展示数据示例
Feb 12 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
php绘图之加载外部图片的方法
Jan 24 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
php微信开发之自定义菜单完整流程
Oct 08 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
PHP的mysqli_ssl_set()函数讲解
Jan 23 PHP
TP3.2框架分页相关实现方法分析
Jun 03 PHP
php去除deprecated的实例方法
Nov 17 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中英混合字符串截取函数代码
2011/07/17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
js实现抽奖的两种方法
2020/03/19 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
Python实现建立SSH连接的方法
2015/06/03 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
财务主管的岗位职责
2013/12/30 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
项目合作意向书范本
2014/04/01 职场文书
故宫英文导游词
2015/01/31 职场文书
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android