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抽奖小程序的实现代码
Jun 18 PHP
php静态文件生成类实例分析
Jan 03 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
php计算税后工资的方法
Jul 28 PHP
关于PHP文件的自动运行方法分析
May 13 PHP
Thinkphp批量更新数据的方法汇总
Jun 29 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
利用PHP实现一个简单的用户登记表示例
Apr 25 PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
php中常用字符串处理代码片段整理
2011/11/07 PHP
php对数组排序代码分享
2014/02/24 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
python感知机实现代码
2019/01/18 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
国贸专业个人求职信分享
2013/12/04 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
大学毕业生个人总结
2015/02/28 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
tomcat下部署jenkins的方法
2022/05/06 Servers