日期:2012-10-04  浏览次数:20606 次

  有一段时间一直迷惑于PHP中引用的传递,后来查手册及C源程序,并反复测试,大致对引用传递在内存中的模式有了一定的了解,后来为了加深印象,写了个总结,应该不会有大的问题——当然这是在PHP4中,在以后的版本中可能会有变化。当时写总结的时候,想锻炼一下英语,因此就凑合了一篇。不过本人英语不好,也懒得翻译,反正当时想自己看得懂就行了。今天心血来潮,突然觉得还蛮有用的,于是在这里现丑了,请大家指正。那位看得懂的帮忙翻译一下吧,我没空了。

<?php 
/* 

filename: SetGetTest.php 

comment on assignment by value and referrence 
assuming $var is a varialbe, its handle(pointer) is named as *var, 
and its content is named as @var 

the memory area of @var is referred by *var, if the *var is the same,  
then the memory areas are the same, so *var is just like a pointer. 

1. when $var = $var1 
@var copied from @var1, but in the different memory area,  
new *var assigned by the system, pointing to the memory area holding @var 
*var and *var1 are different 

2. when $var =& $var1, 
*var assigned by *var1, and the @var is not assigned or copied,  
it is absolutely the same as @var1, and in the same memory area 
both *var and *var1 pointing to the memory area, that means they are the same. 

passing by referrence 
3.  
function set1(&$s){ 
$var =& $s; 

set1($var1) results: 
*var1 passing to the function, and *s is the same as *var1, 
then *var is the same as *s, the result is that *var is the same as *var1 
and all the contents are the same obviously. 

4. 
function set2(&$s){ 
$var = $s; 

set2($var1) results: 
*var1 passing to the function, and *s is the same as *var1, 
but when $var = $s executes, from 1. we can see @var is the same as @s,  
but *var is different from *s, so @var and @s is not in the same memory area, 
while @s and @var1 is sharing the same memory area, also *var1 and *s are the same. 

5. 
normal function return: 
function get(){ return $var1; } 
assuming the result is referred by a variable $result. 
then @result is copied from @var1 but *result is not the same as *var1 
when $var = get(); 
first you get a variable $result, as I said above, @result is the same as @var1, but *result 
is different from *var1, and next $var = $result executes.  
As I said in 1., you can find, @var is the same