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 相关文章推荐
特详细的PHPMYADMIN简明安装教程
Aug 01 PHP
php escape URL编码
Dec 10 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
Aug 15 PHP
php数据库配置文件一般做法分享
Jul 07 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
php数组中删除元素之重新索引的方法
Sep 16 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
PHP最常用的正则表达式
Feb 13 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
Jan 17 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 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令牌 Token改进版
2008/07/18 PHP
PHP 翻页 实例代码
2009/08/07 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
php构造函数与析构函数
2016/04/23 PHP
php 的反射详解及示例代码
2016/08/25 PHP
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
第一次接触神奇的Bootstrap基础排版
2016/07/26 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
python服务器端收发请求的实现代码
2014/09/29 Python
python安装教程
2018/02/28 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
用python解压分析jar包实例
2020/01/16 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Unix控制后台进程都有哪些进程
2016/09/22 面试题
艺术爱好者的自我评价分享
2013/10/08 职场文书
表彰先进集体通报
2014/01/12 职场文书
母婴店促销方案
2014/03/05 职场文书
安全宣传标语口号
2014/06/06 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python