From: colin at encode dot net dot au
Operating system: Windows XP Pro SP2
PHP version: 5.0.2
PHP Bug Type: Arrays related
Bug description: Returning reference to array element produces strange result
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 bug report at http://bugs.php.net/?id=30350&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=30350&r=trysnapshot4
Try a CVS snapshot (php5.0): http://bugs.php.net/fix.php?id=30350&r=trysnapshot50
Try a CVS snapshot (php5.1): http://bugs.php.net/fix.php?id=30350&r=trysnapshot51
Fixed in CVS: http://bugs.php.net/fix.php?id=30350&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=30350&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=30350&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=30350&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=30350&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=30350&r=support
Expected behavior: http://bugs.php.net/fix.php?id=30350&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=30350&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=30350&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=30350&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=30350&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=30350&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=30350&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=30350&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=30350&r=float
MySQL Configuration Error: http://bugs.php.net/fix.php?id=30350&r=mysqlcfg