PHP函数引用返回的实例详解


Posted in PHP onSeptember 11, 2016

引用返回

手册里是这么写的:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用

当你想将函数的返回引用绑定到某个变量时,PHP允许你这么做:

function &returns_reference()
{
  static $someref = 0;
  $someref++;
  return $someref;
}
 
$newref = &returns_reference();//引用返回,相当于 $newref = &$someref;
echo $newref; //1
//phpfensi.com
$notref = returns_reference(); //值传递的是副本
$newref = 100;
echo $notref; //2
 
$newref = 100;
echo returns_reference(); //101

可见,想让函数返回引用,必须在函数申明和赋值时都带上&操作符.

对于类中方法也是如此:

class foo {
  public $value = 0;
 
  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;

一些简单的例子

看下面的简单例子,尝试去理解引用返回.

<?php
function &test()
{
 // 声明一个静态变量
  static $b = 0;
  $b = $b+1;
  echo $b;
  return $b;
}
$a = test(); //这条语句会输出 $b 的值为 1
$a = 5;
$a = test(); //这条语句会输出 $b 的值为2
$a = &test(); //这条语句会输出 $b 的值为3
$a = 5;
$a = test(); //这条语句会输出 $b的值 为6
?>
//程序运行结果:
1
2
3
6

尽管函数声明方式是 function &test() 这样,但我们通过这种方式 $a = test() 的函数调用得到的其实不是函数的引用返回,这跟普通的函数调用没有区别。PHP 规定通过 $a = &test() 这种方式得到的才是函数的引用返回。

用上面的例子来解释就是,$a = test() 这种方式调用函数,只是将函数的值赋给 $a 而已,而$a做任何改变都不会影响到函数中的$b。

而通过 $a = &test() 方式调用函数呢,它的作用是将 return $b 中的 $b 变量的内存地址与 $a 变量的内存地址指向了同一个地方。即产生了相当于这样的效果 ($a=&$b), 所以改变 $a 的值也同时改变了 $b 的值。

所以在执行了

$a = &test();

$a = 5;

以后,$b的值变为了5。

再来个程序例子加深理解:

<?php
/*
** 值传递和引用传递,值传递传递的是值的一个复本,引用传递传递的是值指向的内存地址
*/
// 函数的引用,定义时也要加上 &
function &func($a,$b){ 
 // 这里为了更直观看到效果,定义一个静态变量
 static $result = 0;  
 $result+=$a+$b;
 echo $result.'<br />';
 return $result;
}
 
$a = $b = 10;
// PHP里这样写函数的引用调用,和调用普通函数没有区别(只是将函数的返回值复制给$c这个变量,$c做任何改变不会影响上面函数中的$result)
// 要记住:PHP里的函数引用定义及调用都要在函数名前加上 &
$c = func($a,$b); 
// 第一次执行func(),其静态变量$result的值变为 20(10+10)
// 改变$c的值,不会对下面一行语句产生影响
$c = 666; 
// 第二次执行func(),其静态变量$result的值变为 40(20+10+10)
$c = func($a,$b);
echo '<hr />';
// 这样才是PHP中引用函数的调用方式
$d = &func($a,$b); 
// 第三次执行func(),其静态变量$result的值变为 40(40+10+10)
$d = 888;
// 第四次执行func(),其静态变量$result的值变为 908(888+10+10)
$d = func($a,$b);
?>

总结

关于php函数引用返回的内容到这就基本结束了,希望对大家学习或使用PHP函数能有所帮助,如果有疑问大家可以留言交流。谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
基于mysql的论坛(6)
Oct 09 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
PHP URL地址获取函数代码(端口等) 推荐
May 15 PHP
PHP游戏编程25个脚本代码
Feb 08 PHP
PHP中echo和print的区别
Aug 28 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 #PHP
详解PHP中array_rand函数的使用方法
Sep 11 #PHP
PHP入门教程之上传文件实例详解
Sep 11 #PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 #PHP
PHP入门教程之表单与验证实例详解
Sep 11 #PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 #PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
Sep 11 #PHP
You might like
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
python实现简单井字棋小游戏
2020/03/05 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
人力资源管理毕业生自荐信
2013/11/21 职场文书
房屋出租委托书格式
2014/09/23 职场文书
先进基层党组织材料
2014/12/25 职场文书
新娘婚礼致辞
2015/07/27 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技