php function 定义时函数名前加&符号的意义
看了很多帖子,但是都不能理解,又去看了很多资料,终于名白了.记下备忘.
问题:php在声明函数时,函数名前面的&符号有什么用?
一直想不通.很多帖子说类似于变量的$a=&$b,但是$b在声明的时候前面可没有加&符号啊?那么这个函数名前面加&有什么用呢?
很多人看的都是网上的例子,先用网上例子试一下:
function
&test(){
static
$b
= 0;
//声明一个静态变量
$b
=
$b
+1;
return
$b
;
}
$a
= test();
//输出 $b 的值为:1
$a
= 5;
$a
= test();
//输出 $b 的值为:2
$a
= &test();
//输出 $b 的值为:3
$a
= 5;
//$b的值变为了5
$a
= test();
//输出 $b 的值为:6
这看不出什么,$a是函数test的引用吗?那么继续
function
&test(){
static
$b
= 0;
//声明一个静态变量
$b
=
$b
+1;
return
$b
;
}
$a
= test();
//输出 $b 的值为:1
$a
= 5;
$a
= test();
//输出 $b 的值为:2
$a
= &test();
//输出 $b 的值为:3
echo $a; //输出$b 的值还是3
也就是说,如果$a是test函数的引用,那么echo $a的话会再次调用函数,那么$b的值会再次加1才对
但是$a的值没有变,也就是说,$a保存的是test函数返回值的引用,即$b的引用.所以说相当于$a=&$b.
也正因为如此,如果要实现对函数结果的引用:
1.在赋引用的时候,test前要加&
2.在声明的时候函数名前要加&,表示可以返回函数执行结果的一个引用
3.同时函数必须有返回值,废话,没返回值那引用谁?
举个没有歧义的例子:
function &abc($n){
$arr=array('aaa','bbb','ccc');
return $arr[$n]; //将数组的第二个元素返回
}
$tem=&abc(1); //这里只能得到数组的第二个元素的引用,因为只返回了第二个元素
$tem='ddd'; //这里将数组的第二个元素的值改变成了'ddd'
这个特点一般用来返回一些比较占空间的值,比如大的字符串等,但由于php的写时复制特点,这个技巧一般用的不多,
但是当你需要对函数运算结果进行即时修改的话,那就可以用这个技巧了.
php function 定义时函数名前加&符号的意义的更多相关文章
- 函数名前加 & 符号的深入理解 C++
#include <iostream> using namespace std; int& test_str() { ; return a; //通过返回 a 的地址来进行 值的返 ...
- 某些情况下调用函数为什么要在函数名前加“(void)”
我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...
- MFC中函数名前加 :: 原因
在开发MFC之前,开发的是以AFx(Application Frameworks,x是没有什么意义的)开头的一些函数.但是那个时候开发的函数并没有进行封装,但是有很多很有用的函数.最后AFx开发失败, ...
- python定义函数时,形参前加*和**的意义
转发:https://blog.csdn.net/qq_34806812/article/details/82017839 1.加*表示接受一个tuple类型(元组),如: 2.加**表示接受一个di ...
- C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern "C"的作用
调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数 ...
- php中函数前加&符号的作用分解
这篇文章主要介绍了php中的函数前加&符号的作用分解,其作用叫做引用返回,有点抽象,详细解释请看本文内容,需要的朋友可以参考下 (转载) php变量前面加&符号是什么意思就不用多说了 ...
- JS 中函数名后面加与不加括号的区别
a.onmouseover = fn1; a.onmouseout = fn2; function fn1(){ div.className = "erweima show"; } ...
- php函数前面加&符号 和 变量前面加&符号的意义
php函数前面加&符号 和 变量前面加&符号的意义 php函数前面加&符号的意思是函数的引用返回,php函数前面加&符号有什么作用呢 function &tes ...
- php 变量名前加一个下划线含义
https://segmentfault.com/q/1010000006467833 一个下划线是私有变量以及私有方法两个下划线是PHP内置变量. 以下划线开头,表示为类的私有成员. 这只是个不成文 ...
随机推荐
- VS2012新建项目出错:未找到与约束
VS2012中,选择新建linq to sql 类,结果出错: 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryS ...
- Helpers\Number
Helpers\Number This helper has 2 methods for converting a number format and to get a percentage. Num ...
- Linux编程之《进程/线程绑定CPU》
Intro----- 通常我们在编写服务器代码时,可以通过将当前进程绑定到固定的CPU核心或者线程绑定到固定的CPU核心来提高系统调度程序的效率来提高程序执行的效率,下面将完整代码贴上. /***** ...
- vs2010 编译Qt5.2 rc1
首先要准备一些依赖: 下载Qt 5.2.0 rc版的源码 qt-everywhere-opensource-src-5.2.0-rc1.7z 并解压出来, 我的路径为D:\qt5\qt-src-5.2 ...
- Android(java)学习笔记99:android的短信发送器研究
1.第一种可以调用系统内部的短信程序. 之前我曾经出现过一个bug就是报错: android.content.ActivityNotFoundException: No Activity found ...
- 转载:Restore SQL Server database and overwrite existing database
转载自:https://www.mssqltips.com/sqlservertutorial/121/restore-sql-server-database-and-overwrite-existi ...
- LeetCode 344
Reverse String Write a function that takes a string as input and returns the string reversed. Exampl ...
- 从零单排Linux – 3 – 目录结构
从零单排Linux – 3 – 目录结构 1.FHS标准(filesystem hierarchy standard) why? –> 为了规范,还有为了linux的发展 重点 –> 规范 ...
- jQuery选择器解释和说明
jQuery选择器的意义在于快速的找出特定的DOM元素,然后添加相应的行为. 基本选择器 //选择 id为 one 的元素 $('#btn1').click(function(){ $('#one') ...
- xml使用系统整理
1. 认识xml 可扩展标记语言,一种用于标记电子文档使其具有结果性的标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 2. 和超文本标记语言区别 2.1 ...