php function 定义时函数名前加&符号的意义[通俗易懂]

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函数前面加&符号的意思是函数的引用返回,php函数前面加&符号有什么作用呢  

Php代码  
收藏代码

  1. function &test()  
  2. {  
  3. static $b=0;//申明一个静态变量  
  4. $b=$b+1;  
  5. echo $b;  
  6. return $b;  
  7. }  
  8.   
  9. $a=test();//这条语句会输出 $b的值 为1  
  10. $a=5;  
  11. $a=test();//这条语句会输出 $b的值 为2  
  12. $a=&test();//这条语句会输出 $b的值 为3  
  13. $a=5;  
  14. $a=test();//这条语句会输出 $b的值 为6  

 

下面解释下: 
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别.

至于原因: 这是PHP的规定
php规定通过$a=&test(); 方式得到的才是函数的引用返回.

至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。)

 

用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b.
而通过$a=&test()方式调用函数呢, 他的作用是将return $b中的 $b变量的内存地址与$a变量的内存地址,
指向了同一个地方. 即产生了相当于这样的效果($a=&b;) 所以改变$a的值,也同时改变了$b 的值 ,所以在执行了:
$a=&test();  $a=5; 以后,$b的值变为了5 ……

 

php函数前面加&符号是什么意思?有的函数前面会加&,因为很少见到,所以不明白php函数前面加&符号是什么意思

那么,php函数前面加&符号有什么作用呢

 

Java代码  
收藏代码

  1. function &test()  
  2. {  
  3. static $b=0;//申明一个静态变量  
  4. $b=$b+1;  
  5. echo $b;  
  6. return $b;  
  7. }  
  8.   
  9. $a=&test();//这条语句会输出 $b的值 为1  
  10. $a=6;  
  11. test();//这条语句会输出$b的值 为7  

php变量前面加&符号是什么意思

先看一个示例 

Php代码  
收藏代码

  1. $foo = 321;  
  2. $bar = &$foo;   
  3. $bar = 123;  
  4. print $foo;  

那么输出的结果将会是什么呢

Php代码  
收藏代码

  1. 123    

 

为什么会这样呢?

改动新的变量将影响到原始变量,这种赋值操作更加快速

 

注意:只有命名变量才可以传地址赋值

就是说,改变了$bar的值,也就改变了$foo的值了

https://justcoding.iteye.com/blog/652937
原文:https://blog.csdn.net/csdn_dengfan/article/details/53907416

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112175.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 同步调用、回调和异步调用区别

    同步调用、回调和异步调用区别同步调用是以一种阻塞式调用比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。现在有A、B、C、D四个烽火,A首先点亮,B看到A的烽火亮了,立马去点火,花了2秒点亮。但是这时候负责C烽火的人在睡觉,可是这时候所有人都在等待C点亮,终于C睡了2个小时候看到了B点亮,然后去点亮。D由于长期没有点亮,导致烽火出现问题,因此整个过程都在等待D的完

  • 13款国内外知名PHP集成环境的优缺点分析,PHP集成环境推荐、PHP绿色集成环境推荐「建议收藏」

    13款国内外知名PHP集成环境的优缺点分析,PHP集成环境推荐、PHP绿色集成环境推荐「建议收藏」在本地测试网站,有个集成环境直接测试还是蛮方便的,下面向各位推荐国内和国外各种牛逼的php集成环境 排名不分先后! Xampp集成环境下载解压就能使用了,还支持苹果系统,溜的飞起。英文界面,用着B格也提高了不少。优点:支持的系统多啊,软件使用简单,可视化界面缺点:没有集成VC运行库,遗憾  然后就是老牌的apm

  • matlab画圆的命令_matlab画圆命令[通俗易懂]

    matlab画圆的命令_matlab画圆命令[通俗易懂]%%圆环面R=6;r=2;symsuv;ezmesh((R+r*cos(u))*cos(v),(R+r*cos(u))*sin(v),r*sin(u));axisequal;%%圆盘R=6;r=2;theta=linspace(0,2*pi,90);ph=linspace(r,R,30);[t,p]=meshgrid(theta,ph);r=t*0;[x,y,z]=pol…

  • GIT问题:fatal: Out of memory, malloc failed问题的解决[通俗易懂]

    执行gitconfig–globalpack.windowMemory1024m解决多数人抄袭这个,尝试过后没有效果 目录\.git\config[core]repositoryformatversion=0filemode=truebare=true[pack]   window=0 …

  • Flume和Kafka结合使用的分析[通俗易懂]

    Flume和Kafka结合使用的分析[通俗易懂]转载地址:https://www.zhihu.com/question/36688175/answer/68692597http://blog.csdn.net/crazyhacking/article/details/45746191采集层主要可以使用Flume,Kafka两种技术:Flume:Flume是管道流方式,提供了很多的默认实现,让用户通过参数部署,及扩展API。

  • list的五种去重方法

    list的五种去重方法面试中经常被问到的list如何去重,一般是口述,不需要代码体现,这个时候,思维一定要清晰,可以罗列出集中去重的方法,以展现你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固下面,我就将五种方法逐一展现新建一个list数组:Listlist=newArrayList();list.add(26);list.add(39);list.add(5)…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号