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系统流量分析的程序
Oct 09 PHP
PHP中的正规表达式(二)
Oct 09 PHP
PHP5.2下chunk_split()函数整数溢出漏洞 分析
Jun 06 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
Mar 13 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 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
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
Yii2如何批量添加数据
2016/05/17 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
使用Python神器对付12306变态验证码
2016/01/05 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
老生常谈Python基础之字符编码
2017/06/14 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
python八皇后问题的解决方法
2018/09/27 Python
python交易记录链的实现过程详解
2019/07/03 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
python如何调用字典的key
2020/05/25 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
小区门卫岗位职责
2013/12/31 职场文书
采购意向书范本
2014/03/31 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
六查六看六改心得体会
2014/10/14 职场文书
主持人开幕词
2015/01/29 职场文书
上诉状格式
2015/05/23 职场文书
孔繁森观后感
2015/06/10 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js