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 相关文章推荐
discuz Passport 通行证 整合笔记
Jun 30 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
Jun 21 PHP
PHP中通过fopen()函数访问远程文件示例
Nov 18 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
微信access_token的获取开发示例
Apr 16 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
PHP打印输出函数汇总
Aug 28 PHP
php微信公众号开发之欢迎老朋友
Oct 20 PHP
PHP中mysqli_get_server_version()的实例用法
Feb 03 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 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 addslashes和mysql_real_escape_string
2010/01/24 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
遗传算法之Python实现代码
2017/10/10 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
竟聘演讲稿范文
2013/12/31 职场文书
病假条格式范文
2015/08/17 职场文书
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技