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 相关文章推荐
phpfans留言版用到的install.php
Jan 04 PHP
php5 mysql分页实例代码
Apr 10 PHP
php 进度条实现代码
Mar 10 PHP
关于PHP递归算法和应用方法介绍
Apr 15 PHP
基于PHP常用函数的用法详解
May 10 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
php读取文件内容到数组的方法
Mar 16 PHP
PHP内核探索之变量
Dec 22 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
php注册登录系统简化版
2020/12/28 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
python计算圆周率pi的方法
2015/07/11 Python
Python交互环境下实现输入代码
2018/06/22 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
Python 串口读写的实现方法
2019/06/12 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
Python如何给你的程序做性能测试
2020/07/29 Python
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
新员工入职感言
2014/02/01 职场文书
投标售后服务承诺书
2015/04/29 职场文书
2015年幼儿园班主任工作总结
2015/05/12 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
nginx rewrite功能使用场景分析
2022/05/30 Servers
nginx静态资源的服务器配置方法
2022/07/07 Servers
tree shaking对打包体积优化及作用
2022/07/07 Java/Android