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的栏目导航程序
Oct 09 PHP
php下载远程文件类(支持断点续传)
Nov 14 PHP
PHP转换文件夹下所有文件编码的实现代码
Jun 06 PHP
php实现查询百度google收录情况(示例代码)
Aug 02 PHP
linux下安装php的memcached客户端
Aug 03 PHP
在win7中搭建Linux+PHP 开发环境
Oct 08 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
PHP实现原比例生成缩略图的方法
Feb 03 PHP
php文件上传类完整实例
May 14 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
Laravel开启跨域请求的方法
Oct 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 curl_init函数用法
2014/01/31 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
对于防止按钮重复点击的尝试详解
2019/04/22 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
中科方德软件测试面试题
2016/04/21 面试题
乌鸦喝水教学反思
2014/02/07 职场文书
核心价值观演讲稿
2014/05/13 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
武当山导游词
2015/02/03 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
MySQL添加索引特点及优化问题
2022/07/23 MySQL