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 heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
Feb 16 PHP
php feof用来识别文件末尾字符的方法
Aug 01 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
php判断是否为json格式的方法
Mar 04 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
php实现对两个数组进行减法操作的方法
Apr 17 PHP
php简单压缩css样式示例
Sep 22 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
Oct 26 PHP
PHP如何防止用户重复提交表单
Dec 09 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 文件上传类代码
2011/08/06 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
Python线程threading模块用法详解
2020/02/26 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
深入了解Python enumerate和zip
2020/07/16 Python
Python用SSH连接到网络设备
2021/02/18 Python
校园活动宣传方案
2014/03/28 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
舞出我人生观后感
2015/06/16 职场文书
学校团代会开幕词
2016/03/04 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技