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 相关文章推荐
php中理解print EOT分界符和echo EOT的用法区别小结
Feb 21 PHP
php中随机显示图片的函数代码
Jun 23 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
php数组添加与删除单元的常用函数实例分析
Feb 16 PHP
php如何连接sql server
Oct 16 PHP
PHP递归创建多级目录
Nov 05 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
PHP智能识别收货地址信息实例
Jan 05 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一些十分严重的缺陷详解
2013/06/03 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
php的闭包(Closure)匿名函数详解
2015/02/22 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
通过Python 接口使用OpenCV的方法
2018/04/02 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
Python实现八皇后问题示例代码
2018/12/09 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
python对execl 处理操作代码
2020/06/22 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
高中毕业自我鉴定
2013/12/13 职场文书
酒店司机岗位职责
2013/12/14 职场文书
高中生活自我鉴定
2014/01/18 职场文书
物流业务员岗位职责
2014/02/08 职场文书
应用心理学专业求职信
2014/08/04 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android