设为首页 收藏本站
查看: 713|回复: 0

[经验分享] PHP传值和传引用、传地址的区别

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-26 13:28:18 | 显示全部楼层 |阅读模式
  PHP传值和传引用、传地址的区别是什么?
  传值:
  是把实参的值赋值给形参,那么对形参的修改,不会影响实参的值
  
传地址:
  是传值的一种特殊方式,只是他传递的是地址,不是普通的如int
那么传地址以后,实参和形参都指向同一个对象
传引用:
  真正的以地址的方式传递参数
传递以后,形参和实参都是同一个对象,只是他们名字不同而已
对形参的修改将影响实参的值

  
  从函数调用的角度理解比较好
传值:
函数参数压栈的是参数的副本,任何的修改是在副本上作用,没有作用在原来的变量上。
  
传指针:
压栈的是指针变量的副本。
当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。
  传引用:
压栈的是引用的副本。由于引用是指向某个变量的,对引用的操作其实就是对他指向的变量的操作。(作用和传指针一样,只是引用少了解指针的草纸)  

  
  
  函数参数传递机制的基本理论
  
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题;函数的目的终归是对目标数据的处理(常见的有,设置变量的值等其它属性)。
  基本的参数传递机制有两种:值传递和引用传递。
  以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数:
     
  值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(ps:即值传递过程中,函数是对作为局部变量的形参进行的操作!)
     
  引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 ps:表面对形参的操作实际是对实参变量的操作。
  如上所述,值传递和引用传递对实参变量的处理过程是不一样的,函数对值的操作和对引用的操作的机制是不一样;形参总是被作为局部变量来处理的,函数会根据在其内存空间中存储的是实参的值的副本还是实参的地址的副本分别处理,至于函数是如何区分值和地址的,我不得而知,貌似也不必知道。
  
  
仅讨论一下值传递和引用:
  所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。
所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。
  引用的作用
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。
  取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
  <?php
$a = 1;
$b =& $a;
unset ($a);
?>
  不会 unset $b,只是 $a。
  global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:
  <?php
$var =& $GLOBALS["var"];
?>
  这意味着,例如,unset $var 不会 unset 全局变量。
  $this
在一个对象的方法中,$this 永远是调用它的对象的引用。
  补充:
php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104502-1-1.html 上篇帖子: php header 函数详解 下篇帖子: php call_user_func和call_user_func_array
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表