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.ini中文版(2)
Oct 09 PHP
图书管理程序(一)
Oct 09 PHP
PHP 加密与解密的斗争
Apr 17 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
Dec 29 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
PHP加密解密字符串汇总
Apr 26 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
PHP二维数组去重实例分析
Nov 18 PHP
php tpl模板引擎定义与使用示例
Aug 09 PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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
zend framework多模块多布局配置
2011/02/26 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
html下载本地
2006/06/19 Javascript
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
JSON相关知识汇总
2015/07/03 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
layui导航栏实现代码
2017/05/19 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
Python占用的内存优化教程
2019/07/28 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
Linux的文件类型
2016/07/05 面试题
歌颂祖国的演讲稿
2014/05/04 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS