ID: 34783 User updated by: oliver dot graetz at gmx dot de Reported By: oliver dot graetz at gmx dot de Status: Open Bug Type: SPL related Operating System: WinXP, Debian Linux PHP Version: 5.1.0RC1 New Comment:
Sorry, I thought I checked everything but I found something similar to this bug here as a comment: http://bugs.php.net/bug.php?id=32983 Still, I think that "We found out that this is not solvable without blowing up the interface and creating a BC or providing an additional interface to support references and thereby creating an internal nightmare - actually i don't see a way we can make that work ever." is not an acceptable answer. Using &offsetGet worked fine in 5.0. An, as I found out, this works in PHP5.0 without &offsetGet: $entry=&$test->offsetGet('valid_op'); $entry[]='three'; So, PHP5.1 didn't fix the interface parser but instead introduced a BC break. Previous Comments: ------------------------------------------------------------------------ [2005-10-07 18:33:01] oliver dot graetz at gmx dot de Description: ------------ I wrote a class implementing ArrayAccess that should behave like a normal array to the outside world. So If I used an element in this array it should be usable like any other array. But there was a problem if the "array" elements were arrays themselves. I got this error: Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in t.php on line 123 OK, you want a reference, you get it. I changed offsetGet to &offsetGet. This worked fine with PHP5.0. But in PHP5.1 the parser became more picky about this: Fatal error: Declaration of WAF_Config::offsetGet() must be compatible with that of ArrayAccess::offsetGet() in myclass.php on line 234 This is correct but it makes implementing ArrayAccess in a way consistent with ordinary arrays impossible! Reproduce code: --------------- <?php class test implements ArrayAccess { private $data=array(); function offsetSet($key,$value) { $this->data[$key] = $value; } // function &offsetGet($key) { return $this->data[$key]; } function offsetGet($key) { return $this->data[$key]; } function offsetUnset($key) { if (array_key_exists($key,$this->data)) { unset($this->data[$key]); } } function offsetExists($key) { return array_key_exists($key,$this->data); } } $t=new test(); $t['huba']=array('one','two'); $t['huba'][]='three'; print_r($t['huba']); Expected result: ---------------- Array ( [0] => one [1] => two [2] => three ) Actual result: -------------- using offsetGet Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in t.php on line 17 using &offsetGet Fatal error: Declaration of test::offsetGet() must be compatible with that of ArrayAccess::offsetGet() in t.php on line 2 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=34783&edit=1
