ID: 30350
User updated by: colin at encode dot net dot au
Reported By: colin at encode dot net dot au
-Status: Open
+Status: Bogus
Bug Type: Arrays related
Operating System: Windows XP Pro SP2
PHP Version: 5.0.2
New Comment:
Ok, it appears that the element is created because we are attempting to
return a reference to something that does not exist. Updating status.
:)
Previous Comments:
------------------------------------------------------------------------
[2004-10-07 05:26:07] colin at encode dot net dot au
Description:
------------
I'm not entirely sure if this is a bug or not, but it seems very odd
nonetheless. I have an array of attributes as a protected class
property, and some simple functions to manipulate this array:
<?php
class Test
{
protected $attributes;
public function __construct()
{
$this->attributes = array();
}
public function setAttribute($name=null,$value=null)
{
$this->attributes[$name] = $value;
}
public function getAttribute($name=null)
{
return $this->attributes[$name];
}
}
$test = new Test();
$test->setAttribute('foo','bar');
$test->setAttribute('omg','bbq');
echo $test->getAttribute('foo');
echo $test->getAttribute('eep');
print_r($test);
?>
Upon executing this code we should define two elements in the
attributes array, show the output of one, then generate a notice error
because the index 'eep' does not exist, and then receive a dump of the
$test object, which should look like this:
Test Object
(
[attributes:protected] => Array
(
[foo] => bar
[omg] => bbq
)
)
This is all fine and to be expected. Now typically with code like this
in PHP4, I would have used an ampersand in front of the getAttribute
function definition to allow a reference to an attribute array element
to be returned. To my understanding only objects are *always* passed
around by reference in PHP5, everything else is still copied (though I
may be wrong), so that would seem to imply to me that we still need the
ampersand to allow a reference to be returned. So let's see what
happens when we put an ampersand in front of the getAttribute function
definition above, like so:
public function &getAttribute($name=null)
{
return $this->attributes[$name];
}
Ok, upon execution now, I receive *no* notice error that the index
'eep' does not exist - instead, a new null element is added to the
array mapped to the key 'eep'. The print_r($test) now shows:
Test Object
(
[attributes:protected] => Array
(
[foo] => bar
[omg] => bbq
[eep] =>
)
)
What gives? Am I doing something really stupid? I don't understand
this.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=30350&edit=1