以下是引用片段: <?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 */ ?> |