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 相关文章推荐
一个更简单的无限级分类菜单代码
Jan 16 PHP
php 不同编码下的字符串长度区分
Sep 26 PHP
PHP 源代码压缩小工具
Dec 22 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
May 31 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
PHP实现合并discuz用户
Aug 05 PHP
是 WordPress 让 PHP 更流行了 而不是框架
Feb 03 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 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实现微信公众平台音乐点播
2014/03/20 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Python输出指定字符串的方法
2020/02/06 Python
python isinstance函数用法详解
2020/02/13 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
DNA测试:Orig3n
2019/03/01 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
如何提高SQL Server的安全性
2016/07/25 面试题
仓库管理专业个人自我评价范文
2013/11/11 职场文书
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
志愿者活动总结范文
2014/04/26 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
python三子棋游戏
2022/05/04 Python