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 相关文章推荐
一个显示天气预报的程序
Oct 09 PHP
PHP实现定时生成HTML网站首页实例代码
Nov 20 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
Jun 06 PHP
php shell超强免杀、减少体积工具实现代码
Oct 16 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
php类的定义与继承用法实例
Jul 07 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
Laravel实现ApiToken认证请求
Oct 14 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
jquery获取节点名称
2015/04/26 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
浅析Jquery操作select
2016/12/13 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
vuex的简单使用教程
2018/02/02 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
python创建学生成绩管理系统
2019/11/22 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
Sony C++笔试题
2013/03/10 面试题
大学生个人自我鉴定
2013/12/03 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
世博会口号
2014/06/20 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
英语通知范文
2015/04/22 职场文书
改进工作作风心得体会
2016/01/23 职场文书