Regarding the earlier behavior I noticed regarding references: now I've come across something REALLY weird. Check this out:
<?php // Dummy class class Test { var $myString; } // Instantiate it $object = &new Test(); // Create a member $object->myString = 'hello'; // Test function function testObject() { global $object; // Make a copy of the member variable (no '&') $newString = $object->myString; // Return the COPY return $newString; } // Grab the return from the function (notice the '&') $copiedString = &testObject(); // Modify it $copiedString = 'goodbye'; // Print the original and the copy out echo "=== array ===\n"; echo $object->myString . "\n"; ?> Here's the output: === array === goodbye Huh?! I even made a copy inside the function! Note that just as before (see original message), the following change "fixes" things: function testObject() { global $object; // Create a reference to the member variable $newString = &$object->myString; // Return the reference return $newString; } Now the output is as expected(?): === array === hello Can anyone tell me what's going on here? I don't think this is at all the correct behavior. On Sun, 2002-10-20 at 05:02, Matthew Bogosian wrote: > Howdy all, > > I have stumbled onto a reference behavior I cannot explain. Here's my > problem: I'm trying to return a copy of a member variable. The function > is not declared to return a reference, but it seems as if the user can > override this. Here's a non-object example: > > <?php > > // Create an array > $array = array('foo', 'bar', 'baz'); > > // This function merely returns a copy of the array > function testArray() > { > global $array; > > return $array; > } > > // Grab the return from the function (notice the '&') > $copiedArray = &testArray(); > > // Modify it > $copiedArray[] = 'quux'; > > // Print the original and the copy out > echo "=== array ===\n"; > var_dump($array); > echo "=== copiedArray ===\n"; > var_dump($copiedArray); > > ?> > > Running this yields exactly what you would expect: > > === array === > array(3) { > [0]=> > string(3) "foo" > [1]=> > string(3) "bar" > [2]=> > string(3) "baz" > } > === copiedArray === > array(4) { > [0]=> > string(3) "foo" > [1]=> > string(3) "bar" > [2]=> > string(3) "baz" > [3]=> > string(4) "quux" > } > > So far, so good. This is as expected (even if the caller tries to use > the '&', he's getting the reference to the copy). Now instead of a > global array, let's try the exact same thing with a member of a global > object: > > <?php > > // Dummy class > class Test > { > var $array; > } > > // Instantiate it > $object = &new Test(); > // Create a member that is an array > $object->array = array('baz', 'bar', 'foo'); > > // Same function as before, only it's returning a member variable > function testObject() > { > global $object; > > return $object->array; > } > > // Grab the return from the function (notice the '&') > $copiedArray = &testObject(); > // Modify it > $copiedArray['lyx'] = 'quux'; > > // Print the original and the copy out > echo "=== array ===\n"; > var_dump($object->array); > echo "=== copiedArray ===\n"; > var_dump($copiedArray); > > ?> > > Here, I would expect that the results would be exactly the same > (remember, there are absolutely no references in the declaration of > testObject() or in the body; everything *should* be a copy). Here's what > gets printed when this is run: > > === array === > array(4) { > [0]=> > string(3) "baz" > [1]=> > string(3) "bar" > [2]=> > string(3) "foo" > ["lyx"]=> > string(4) "quux" > } > === copiedArray === > array(4) { > [0]=> > string(3) "baz" > [1]=> > string(3) "bar" > [2]=> > string(3) "foo" > ["lyx"]=> > string(4) "quux" > } > > Whoa! $copiedArray is now a reference for the member variable! But look > what happens if I redefine the function slightly: > > function testObject() > { > global $object; > $array = &$object->array; > > return $array; > } > > Now I get what I expect again ($copiedArray doesn't point to the member > variable after calling testObject()). So what gives? Why is "return > $object->member;" exempt from the return declaration of the function? > This is an interesting "feature". Not very intuitive...I'd call it a > bug. Has anyone else noticed this? The above behavior happens with > scalars (e.g., strings, numbers) too, not just arrays. > > By the way, I'm using PHP 4.2.3. > > --Matt > > -- > Please do not sell or give away my information. -- Please do not sell or give away my information.
signature.asc
Description: This is a digitally signed message part