为您详解PHP开发工具的使用与分析

  • 来源: IT168 作者: sevenleaf   2010-05-10/14:40
  •       有一段时间一直迷惑于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>\n"; 

    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 
    */ 
    ?>


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多