动态网页PHP中援用&的使用留意事项
核心提示:动态网页PHP中援用&的使用留意事项
之前1个朋友的帖子提到过这方面的疑问,这里简单整理1下,希看能让更多新学php的朋友得到帮助。
php的援用(就是在变量或函数、对象等前面加上&符号)是个高级话题,新手多留意,正确的理解php的援用很重要,对性能有较大影响,而且理解毛病可能导致程序毛病!
很多人误解php中的援用跟C当中的指针1样,事实上并非如此,而且很大差别。C语言中的指针除在数组传递进程中不用显式申明外,其他都需要使用*进行定义,而php中对地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中援用采取的是“写时拷贝”的原理,就是除非产生写操纵,指向同1个地址的变量或对象是不会被拷贝的,比以下面的代码:
以下为援用的内容: $a = array('a','c'...'n'); |
假设程序仅履行到这里,$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:代码,函数,内存,数组,指针
评论加载中...
|