唐山网站建设

设为主页 加入收藏 繁體中文

动态网页PHP中援用&的使用留意事项

核心提示:动态网页PHP中援用&的使用留意事项

之前1个朋友的帖子提到过这方面的疑问,这里简单整理1下,希看能让更多新学php的朋友得到帮助。

php的援用(就是在变量或函数、对象等前面加上&符号)是个高级话题,新手多留意,正确的理解php的援用很重要,对性能有较大影响,而且理解毛病可能导致程序毛病!

很多人误解php中的援用跟C当中的指针1样,事实上并非如此,而且很大差别。C语言中的指针除在数组传递进程中不用显式申明外,其他都需要使用*进行定义,而php中对地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中援用采取的是“写时拷贝”的原理,就是除非产生写操纵,指向同1个地址的变量或对象是不会被拷贝的,比以下面的代码:

以下为援用的内容:

$a = array('a','c'...'n');
$b = $a;

假设程序仅履行到这里,$b和$b是相同的,但是并没有像C那样,$a和$b占用不同的内存空间,而是指向了同1块内存,这就是php和c的差别,其实不需要写成$b=&$a才表示$b指向$a的内存,zend就已帮你实现了援用,并且zend会非常智能的帮你往判定甚么时候该这样处理,甚么时候不该这样处理。

假设在后面继续写以下代码,增加1个函数,通过援用的方式传递参数,并打印输出数组大小。

   

以下为援用的内容:
 function printArray(&$arr) //援用传递
    {
        print(count($arr));
    }
     printArray($a);

上面的代码中,我们通过援用把$a数组传进printArray()函数,zend引擎会以为printArray()可能会导致对$a的改变,此时就会自动为$b生产1个$a的数据拷贝,重新申请1块内存进行存储。这就是前面提到的“写时拷贝”概念。

假设我们把上面的代码改成下面这样:

以下为援用的内容:
 function printArray($arr)  //值传递
    {
        print(count($arr));
    }
     printArray($a);

上面的代码直接传递$a值到printArray()中,此时其实不存在援用传递,所以没有出现写时拷贝。

大家可以测试1下上面两行代码的履行效率,比如外面加进1个循环1000次,看看运行的耗时,结果会让你知道不正确使用援用会导致性能降落30%以上。

http://www.fw8.net/
TAG:代码,函数,内存,数组,指针
评论加载中...
内容:
评论者: 验证码: