|  | Posted by Curt Zirzow on 01/08/05 21:12 
* Thus wrote Don:> Hi,
 >
 > Reading the PHP 5 documentation at: HYPERLINK
 > "http://www.php.net/manual/en/language.oop5.basic.php"http://www.php.net/man
 > ual/en/language.oop5.basic.php, I am confused.
 
 After looking at the example output, it is not correct, the real
 output should be:
 
 object(SimpleClass)#1 (1) {
 ["var"]=>
 string(30) "$assigned will have this value"
 }
 object(SimpleClass)#1 (1) {
 ["var"]=>
 string(30) "$assigned will have this value"
 }
 object(SimpleClass)#1 (1) {
 ["var"]=>
 string(30) "$assigned will have this value"
 }
 
 > In the example given, what is the difference between:
 > $assigned  =  $instance;
 > $reference  =& $instance;
 >
 > I would expect all of the var_dump to display NULL
 
 The manual needs some changes, the example 19-3 is assuming that
 both 19-1 and 19-2 exist in the code, which should result with what
 I have above.
 
 >
 > The doc says "When assigning an already created instance of an object to a
 > new variable, the new variable will access the same instance as the object
 > that was assigned." so the above assignments seem the same to me and setting
 > $instance to NULL should also set $assigned to NULL.
 >
 > If this is not the case and not using the '&' specifies a 'copy'
 > (contradicting the documentation) then what's the purpose of object cloning?
 >
 > I tried the code below and find that it gives the exact same output
 > regardless if I am using the '&' or not so it seems to assign be reference
 > either way.
 
 The way objects are assigned in php5 are a bit different than in
 php4, basically in php4 if you do something like:
 
 $var1 = new Object();
 $var2 = $var1;
 
 It is treated like a clone, where now there are two objects.
 
 php5 on the other hand, its a little more complex. When an object
 is create in php5 and assigned to a variable, there are two things
 that happen:
 
 $var1 = new Object();
 
 1. an object is created
 2. a variable, referencing that object, is created.
 
 
 When you assign a variable (that references the object) to another
 variable, we now have two variables referencing the object:
 
 $var2 = $var1;
 
 So if I issue:
 
 unset($var1);
 
 the same object that was originally crated still exists in $var2,
 until i destroy $var2, then that object gets destroyed as well.
 
 
 Now, with the = & assignment:
 
 $var2 = &$var1;
 
 What happens here is that both $var1 and &var2 become in a way
 identical.  If I issue:
 
 unset($var1);
 
 Then both $var1 and $var2 become unset, thus the original object
 no longer is being referenced by anything.
 
 
 I hope that didn't complicate things, but helped clarified what you
 were looking at.
 
 
 Curt
 --
 Quoth the Raven, "Nevermore."
 [Back to original message] |