11
2015-03

PHP中引用和引用传递以及赋值的解释

 1. PHP中引用的特性
首 先,PHP中的引用不是C的指针,可以把它想象成UNIX文件系统中对文件的链接,是变量的另外一个别名或者映射。
例如:$b = &$a中,$b和$a都只是一个变量名称,此操作使$b和$a都映射到同一个变量内容;$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。
$b = &$c则是让$b重新映射到另外一个变量内容,与$a再无关系;
unset($a)只是断开了$a到变量内容的映射,但变量内容并没有被释放,依然可以使用$b来访问,一旦$b也unset了,那么该变量内容在没有任何映射的情况下会被释放。

2. 函数中global $a的作用
在函数中经常会见到global $a,$b这样的语句,其实质是对$_GLOBAL变量的一种引用,具体可以写成如下语句:
$a = &$_GLOBAL['a'];
$b = &$_GLOBAL['b'];
而$_GLOBAL['a']和$_GLOBAL['b']则分别对应全局作用域中$a和$b变量,在函数中对$a和$b的修改会触发函数外部$a和$b的变量内容的修改。
如果在函数内部做如下操作:
$c = array(1,2,3);
$a = &$c;
那么实际上就是改变了$a的映射关系,之前与$_GLOBAL['a']的映射就断开了,再也无法修改函数外部$a的内容。此特性也同样作用在用引用传递函数参数的例子中。
另外,需要注意在函数中unset($a)不会真正释放变量内容,可以看做只是断开了函数内部$a的映射而已。

3.函数的引用传递
引用传递的定义必须在函数定义中体现,在函数使用中,不要写成foo(&$a)的样子,否则会报"Call-time pass-by-reference过时"的警报。
如下情况可以使用引用传递:
A. 变量,如foo($a)
B. New语句,如foo(new Action())
C. 函数的引用返回,如foo(bar()),其中bar()是函数,定义为:function &bar() {$a = 5; return $a;}
其余情况不可作为引用传递,较常见的比如表达式、常量、无引用的函数返回。

4.函数的引用返回
引用返回需要注意使用形式,在定义时如下:
function &bar() {
   $a = 5;
   return $a;
}
在使用时如下:
$ret = &bar();
也就是说,定义和使用时都需要加&符号。

5.对象的赋值传递
尤其需要注意的是,在PHP4和PHP5中对象资源的赋值传递是有区别的。
PHP4中:
$a = new Object() 实际上$a和new Object()的映射到不同对象实例,所以需要显式地使用$a = & new Object()来进行引用赋值传递。
$b = $a 同上。
foo(new Object()) / foo($a) 同上。
foo() {$a = new Object(); return $a} 同上。
PHP5中:
$a = new Object() 两者映射到同一对象,不需要使用引用符。
$b = $a 同上。
foo(new Object()) / foo($a) 同上。
foo() {$a = new Object(); return $a} 同上。
PS: 在进行测试的时候,发现一个有趣的现象,$a = new Object(); $b = $a后,如果$a->attr = 12; $b->attr = 13,那么最后的结果竟然是$a->attr和$b->attr都等于13,而不是想象中的各自独立,笔者估计$a->attr 和$b->attr并没有做深拷贝,仍是同一块内存的不同映射。该论点待考证。当然,如果是$a = new Object(); $b = &$a; 则不存在该疑惑,因为从头到尾只有一个真实对象,$a和$b都只是映射而已。

6.unset与=null
使 用unset($a)与$a=null的结果是不一样的。如果该块内存只有$a一个映射,那么unset($a)与$a=null等价,该内存的引用计数 变为0,被自动回收;如果该块内存有$a和$b两个映射,那么unset($a)将导致$a=null且$b不变的情况,而$a=null会导 致$a=$b=null的情况。
原因:某变量赋值为null,将导致该变量对应的内存块的引用计数直接置为0,被自动回收。

 


除非注明,文章均为史亚永原创,欢迎转载!转载请注明本文地址,谢谢。

本文地址:http://www.shiyayong.cn/post/269.html

评论列表:

14  快乐网讯  2017/10/9 11:14:54 回复该留言  IP:113.69.244.93
文章不错非常喜欢
快乐网讯
13  素材火  2017/9/7 11:16:37 回复该留言  IP:113.75.59.84
很好的文章,我是来涨知识的
素材火
12  更好  2017/8/7 3:56:15 回复该留言  IP:111.180.2.228
友情链接申请
经常到你的博客浏览,觉得你的博客内容不错,
网站地址:http://www.yuedudg.cn/
360收录7000 百度收录1 大部分关键词在前10页
网站名称:动感博客网
同意的话请到本站留言,
同时也欢迎大家到本站申请友链,首页,内页 均可
更好
11  贝蒂斯橄榄油  2016/8/10 17:49:58 回复该留言  IP:39.65.70.33
太详细了,来学习下。。。
贝蒂斯橄榄油
10  石头肉丸子  2016/8/9 13:23:33 回复该留言  IP:113.75.35.81
世界没有错,唯一的错就是
石头肉丸子
9  青岛礼品定制  2016/8/1 11:03:22 回复该留言  IP:39.65.70.33
解释的很详细,学习一下
青岛礼品定制
8  好文推荐  2016/4/15 13:39:36 回复该留言  IP:58.248.66.44
进来看看
好文推荐
7  山东苹果网  2016/2/22 12:04:41 回复该留言  IP:123.174.42.205
大哥辛苦了,涨知识了
山东苹果网
6  东方新星  2015/11/23 14:27:24 回复该留言  IP:125.70.228.96
这个可以 收藏了
东方新星
5  五常大米  2015/7/28 17:45:15 回复该留言  IP:123.121.43.5
学习了
五常大米
4  心脑康肽茶  2015/6/18 10:55:33 回复该留言  IP:121.238.120.255
有点收货
心脑康肽茶
3  神州网络  2015/4/21 22:23:23 回复该留言  IP:110.180.178.170
专业啊
神州网络
2  草广告联盟  2015/4/9 9:56:13 回复该留言  IP:120.194.185.177
支持一下博主
草广告联盟
1  上海app开发  2015/3/23 23:43:43 回复该留言  IP:123.157.71.142
看了博主的文章,真的很有收获啊
上海app开发

发表评论:

(设置个性头像)

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

无觅相关文章插件,快速提升流量