- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的服务器维护,企业网站维护,网站维护服务
- (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
 
  
    
| 作者:黑客防线网安PHP维护基地 来源:黑客防线网安PHP维护基地 浏览次数:0 | 
有一段时间一直迷惑于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 as @result and the same as @var1,   
but *var is different from *result AND *var1;  
while $var =& get() just means:  
*var is the same as *result, so @var and @result are in the same memory area,   
but they are still different from those of $var1,   
both the memory area of @var1 and *var1,  
6.  
returning by referrence  
function &get(){ return $var1; }  
there are two ways to get the result  
$var = get(); and $var =& get(); now I will tell the difference  
I. $var = get();  
the *result is the same as *var1 and so @result and @var1 are the same.  
and then $var = $result executes,   
*var is not the same as *result, and also different from *var1,   
but their contents are the same.  
I. $var =& get();  
the *result is the same as *var1 and so @result and @var1 are the same.  
and then $var =& $result executes,   
this means $var and $result are the same, both of @ and *  
*/
// the test is the following
function println($s = ""){  
print "$s<br>
";  
}  
class GetSetTest  
{  
var $var = null;  
function setByRef(&$arg){  
$this->var =& $arg;  
}  
function passByRef(&$arg){  
$this->var = $arg;  
}  
function setByVal($arg){  
$this->var = $arg;  
}  
function &getByRef(){  
return $this->var;  
}  
function getByVal(){  
return $this->var;  
}  
}  
$o = new GetSetTest;
println("============ setByRef getByRef =============");  
println("-----------------Before change----------------");  
$in = "before change";  
$o->setByRef($in);  
$outByVal = $o->getByRef();  
$outByRef =& $o->getByRef();  
println("$in: ".$in);  
println("$outByVal: ".$outByVal);  
println("$outByRef: ".$outByRef);  
println("$this->var: ".$o->var);  
println("-----------------After change-----------------");  
$in = "after change";  
println("$in: ".$in);  
println("$outByVal: ".$outByVal);  
println("$outByRef: ".$outByRef);  
println("$this->var: ".$o->var);  
println();  
println("============ setByRef getByVal =============");  
println("-----------------Before change----------------");  
$in = "before change";  
$o->setByRef($in);  
$outByVal = $o->getByVal();  
$outByRef =& $o->getByVal();  
println("$in: ".$in);  
println("$outByVal: ".$outByVal);  
println("$outByRef: ".$outByRef);  
println("$this->var: ".$o->var);  
println("-----------------After change-----------------");  
$in = "after change";  
println("$in: ".$in);  
println("$outByVal: ".$outByVal);  
println("$outByRef: ".$outByRef);  
println("$this->var: ".$o->var);  
println();  
println("============ passByRef getByVal =============");  
println("-----------------Before change----------------");  
$in = "before change";  
$o->passByRef($in);  
$outByVal = $o->getByVal();  
$outByRef =& $o->getByVal();  
println("$in: ".$in);  
println("$outByVal: ".$outByVal);  
println("$outByRef: ".$outByRef);  
println("$this->var: ".$o->var);  
println("-----------------After change-----------------");  
$in = "after change";  
println("$in: ".$in);  
println("$outByVal: ".$outByVal);  
println("$outByRef: ".$outByRef);  
println("$this->var: ".$o->var);  
println();  
/*  
以下输出结果是我(夜猫子)擅自编辑添加的,主要是为后来人查看方便加在这里,越肉代庖,向longnetpro致歉  
输出结果:  
============ setByRef getByRef =============  
-----------------Before change----------------  
$in: before change  
$outByVal: before change  
$outByRef: before change  
$this->var: before change  
-----------------After change-----------------  
$in: after change  
$outByVal: before change  
$outByRef: after change  
$this->var: after change  
============ setByRef getByVal =============  
-----------------Before change----------------  
$in: before change  
$outByVal: before change  
$outByRef: before change  
$this->var: before change  
-----------------After change-----------------  
$in: after change  
$outByVal: before change  
$outByRef: before change  
$this->var: after change  
============ passByRef getByVal =============  
-----------------Before change----------------  
$in: before change  
$outByVal: before change  
$outByRef: before change  
$this->var: before change  
-----------------After change-----------------  
$in: after change  
$outByVal: before change  
$outByRef: before change  
$this->var: after change  
*/  
?>
| 我要申请本站:N点 | 黑客防线官网 | | 
| 专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |