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

问题: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. Windows 7中使用Eclipse 使用CDT and WinGW 开发C/C++(转载)

    以前使用visual studio 2010编写C/C++,后来接触了Eclipse后,据说eclipse也可以编写C/C++,以前觉得Visual studio 2010还蛮不错的,也没有多大好奇心 ...

  2. jqcss选择器

    $("p").css("background-color","red"); $(this) 当前 HTML 元素$("p" ...

  3. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  4. 【转载】Android使用Application总结

    Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application ...

  5. Kali+Win7双系统

    ----------------------------------------------------------前言---------------------------------------- ...

  6. CF Playing with Paper

    Playing with Paper time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. [未完成]关于CSS的总结

    CSS和html 数据和样式分离,在java中称为降低了耦合性. css和html相结合的第一种方式. 1,每一个html标签中都有一个style样式属性.该属性的值就是css代码. 2,使用styl ...

  8. 用Gradle 构建android程序

    前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ...

  9. Git CMD - fetch: Download objects and refs from another repository

    命令格式 git fetch [<options>] [<repository> [<refspec>…​]] git fetch [<options> ...

  10. 个人实验记录之EIGRP基本配置

    一.EIGRP的基本配置 1(1).进入接口配置IP R1(config)#inter s1/0 R1(config-if)#ip address 200.1.1.1 255.255.255.0 R1 ...