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 相关文章推荐
在PHP3中实现SESSION的功能(一)
Oct 09 PHP
php桌面中心(四) 数据显示
Mar 11 PHP
PHP 编写的 25个游戏脚本
May 11 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 PHP
PHP explode()函数用法、切分字符串
Oct 03 PHP
PHP之短标签开启设置
Jun 17 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
PHP中执行cmd命令的方法
Oct 11 PHP
php操作MongoDB类实例
Jun 17 PHP
PHP封装的完整分页类示例
Aug 21 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实现mysql同步的实现方法
2009/10/21 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
yii上传文件或图片实例
2014/04/01 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
三级下拉菜单的js实现代码
2011/05/23 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
StubHub西班牙:购买和出售全球活动门票
2017/06/05 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
数组越界问题
2015/10/21 面试题
外语系毕业生自荐信范文
2013/12/16 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
工商干部先进事迹
2014/05/14 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
css height属性中的calc方法详解
2021/06/03 HTML / CSS
vue实现滑动解锁功能
2022/03/03 Vue.js
Python借助with语句实现代码段只执行有限次
2022/03/23 Python