|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-10-07 18:33 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 06 06:00:02 2025 UTC |
One more point: Adding the & outside of the class just allows referencing under PHP5.0 but not under 5.1. But having references is in no way unfixable under 5.1: class test { // rest as before function &offsetGetRef($key) { return $this->data[$key]; } } $t=new test(); $t['huba']=array('one','two'); $entry=&$t->offsetGetRef('huba'); $entry[]='three'; print_r($t['huba']); Voil?! It works. Telling that it's unfixable just doesn't do the issue justice. Perhaps the fix is more difficult but it can be done. And "we didn't mean to support references in the first place" isn't valid since normal arrays are meant to be used this way and ArrayAccess was meant to mimic this for objects.