看了很多帖子,但是都不能理解,又去看了很多资料,终于名白了.记下备忘.

问题: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 定义时函数名前加&符号的意义的更多相关文章

  1. 函数名前加 & 符号的深入理解 C++

    #include <iostream> using namespace std; int& test_str() { ; return a; //通过返回 a 的地址来进行 值的返 ...

  2. 某些情况下调用函数为什么要在函数名前加“(void)”

    我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...

  3. MFC中函数名前加 :: 原因

    在开发MFC之前,开发的是以AFx(Application Frameworks,x是没有什么意义的)开头的一些函数.但是那个时候开发的函数并没有进行封装,但是有很多很有用的函数.最后AFx开发失败, ...

  4. python定义函数时,形参前加*和**的意义

    转发:https://blog.csdn.net/qq_34806812/article/details/82017839 1.加*表示接受一个tuple类型(元组),如: 2.加**表示接受一个di ...

  5. C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern "C"的作用

    调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数 ...

  6. php中函数前加&符号的作用分解

    这篇文章主要介绍了php中的函数前加&符号的作用分解,其作用叫做引用返回,有点抽象,详细解释请看本文内容,需要的朋友可以参考下  (转载) php变量前面加&符号是什么意思就不用多说了 ...

  7. JS 中函数名后面加与不加括号的区别

    a.onmouseover = fn1; a.onmouseout = fn2; function fn1(){ div.className = "erweima show"; } ...

  8. php函数前面加&符号 和 变量前面加&符号的意义

    php函数前面加&符号 和 变量前面加&符号的意义 php函数前面加&符号的意思是函数的引用返回,php函数前面加&符号有什么作用呢 function &tes ...

  9. php 变量名前加一个下划线含义

    https://segmentfault.com/q/1010000006467833 一个下划线是私有变量以及私有方法两个下划线是PHP内置变量. 以下划线开头,表示为类的私有成员. 这只是个不成文 ...

随机推荐

  1. VS2012新建项目出错:未找到与约束

    VS2012中,选择新建linq to sql 类,结果出错: 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryS ...

  2. Helpers\Number

    Helpers\Number This helper has 2 methods for converting a number format and to get a percentage. Num ...

  3. Linux编程之《进程/线程绑定CPU》

    Intro----- 通常我们在编写服务器代码时,可以通过将当前进程绑定到固定的CPU核心或者线程绑定到固定的CPU核心来提高系统调度程序的效率来提高程序执行的效率,下面将完整代码贴上. /***** ...

  4. vs2010 编译Qt5.2 rc1

    首先要准备一些依赖: 下载Qt 5.2.0 rc版的源码 qt-everywhere-opensource-src-5.2.0-rc1.7z 并解压出来, 我的路径为D:\qt5\qt-src-5.2 ...

  5. Android(java)学习笔记99:android的短信发送器研究

    1.第一种可以调用系统内部的短信程序. 之前我曾经出现过一个bug就是报错: android.content.ActivityNotFoundException: No Activity found ...

  6. 转载:Restore SQL Server database and overwrite existing database

    转载自:https://www.mssqltips.com/sqlservertutorial/121/restore-sql-server-database-and-overwrite-existi ...

  7. LeetCode 344

    Reverse String Write a function that takes a string as input and returns the string reversed. Exampl ...

  8. 从零单排Linux – 3 – 目录结构

    从零单排Linux – 3 – 目录结构 1.FHS标准(filesystem hierarchy standard) why? –> 为了规范,还有为了linux的发展 重点 –> 规范 ...

  9. jQuery选择器解释和说明

    jQuery选择器的意义在于快速的找出特定的DOM元素,然后添加相应的行为. 基本选择器 //选择 id为 one 的元素 $('#btn1').click(function(){ $('#one') ...

  10. xml使用系统整理

    1. 认识xml 可扩展标记语言,一种用于标记电子文档使其具有结果性的标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 2. 和超文本标记语言区别 2.1 ...