PHP中返回引用类型的方法


Posted in PHP onApril 03, 2015

返回引用,在定义和调用的时候 & 都不可以省略。

这是个比较容易混淆的概念,如果不是出于某些特殊的原因,建议还是不要使用。

说他很容易混,是因为 Reference 在 PHP5 中的变化,造成其在 PHP4/PHP5 中表现的行为差异比较大。

举个例子说明:

<?php

 

$color = 'YellowGreen';

 

function &getRef() {

    global $color;

    return $color;

}

 

function getCopy() {

    global $color;

    return $color;

}

 

$colorRef = &getRef();

$colorRef = 'Blue';

 

//$colorCopy = getCopy();

//$colorCopy = 'Black';

 

 

var_dump($color);

var_dump($colorRef);

//var_dump($colorCopy);

 

运行一遍上面的代码,差不多就明白了,使用 &getRef() 将把 $colorRef 绑定到 $color 上面,也就是说 $colorRef 和 $color 两个变量是指向同一个值了。当改变其中一个值时,另一个也会跟着变化。

如果 $color 是一个数组,也是一样的,上面的代码在 PHP4/5 的任意版本中,表现行为都是一样的。

当 $color 是一个 Object 的时候,问题就出现了。

PHP4 中 getCopy 仍然会返回一个复制的 Object;&getRef() 返回引用。

PHP5 中就有点另类了,
最新的 PHP5.2,行为和 PHP4 一样,getCopy() 返回复制,&getRef() 返回引用。
但是某些的 PHP5 的版本这里稍微有些不同,比如 PHP5.1.6,表现为 getCopy() 和 &getRef() 都是引用。

这里 getCopy() 和 &getRef() 是两个全局函数,如果放到类里面成为类的 Member functions,那又会是另外一番景象……

PS:返回 References 并不会提高性能,有时候反而降低性能,所以不要想当然的使用这个特性来“优化”程序。

有问题看看手册大部分时候都可以找到答案:

http://cn.php.net/manual/en/language.references.php

PHP 相关文章推荐
PHP数据缓存技术
Feb 14 PHP
ZF等常用php框架中存在的问题
Jan 10 PHP
PHP 面向对象实现代码
Nov 11 PHP
PHP文件操作实现代码分享
Sep 01 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
学习PHP的数组总结【经验】
May 05 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
自制PHP框架之设计模式
May 07 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 #PHP
PHP5多态性与动态绑定介绍
Apr 03 #PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
Apr 03 #PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 #PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 #PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 #PHP
php实现专业获取网站SEO信息类实例
Apr 02 #PHP
You might like
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
利用npm 安装删除模块的方法
2018/05/15 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python格式化输出%s和%d
2018/05/07 Python
python实现决策树分类
2018/08/30 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python实现抽奖小程序
2020/04/15 Python
python函数的万能参数传参详解
2019/07/26 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
python开发前景如何
2020/06/11 Python
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
Android面试题及答案
2015/09/04 面试题
老师推荐信
2013/10/28 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python