php引用解释,有关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变量的一种引用。

sql语句:

$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} 同上。

备注:

在测试时发现:

$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,被自动回收。

您可能感兴趣的文章:

php引用传值的实例详解

php引用的实例代码

php引用的实例详解

php引用(&)符号详解

有关php变量引用、函数传址以及对象引用的实例解析

php引用传值的详细介绍

通过实例理解php中传值与传引用的区别

通过实例看php地址引用的效率问题

有关php引用地址改变变量值的问题

PHP中的引用,“&”解释

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值