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 相关文章推荐
PHPMailer安装方法及简单实例
Nov 25 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
fleaphp crud操作之findByField函数的使用方法
Apr 23 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
yii上传文件或图片实例
Apr 01 PHP
深入理解PHP内核(一)
Nov 10 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
php如何实现数据库的备份和恢复
Nov 30 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 XML备份Mysql数据库
2009/05/27 PHP
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
PHP内核探索之变量
2015/12/22 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
laravel学习教程之关联模型
2016/07/30 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
Django分页功能的实现代码详解
2019/07/29 Python
Python 如何提高元组的可读性
2019/08/26 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
机电工程学生自荐信范文
2013/12/07 职场文书
企业演讲稿范文
2013/12/28 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
空乘英文求职信
2014/04/13 职场文书
个人工作主要事迹
2014/05/08 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
2015年度女工工作总结
2015/10/22 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL