Edit report at http://bugs.php.net/bug.php?id=34783&edit=1
ID: 34783 Comment by: tohru at reedom dot com Reported by: oliver dot graetz at gmx dot de Summary: Contradictory errors using ArrayAccess Status: Bogus Type: Bug Package: SPL related Operating System: WinXP, Debian Linux PHP Version: 5.1.0RC1 Block user comment: N Private report: N New Comment: It's a bug since the current behavior breaks the Liskov's Substitution Principle when a subclass just overrides offsetGet(). http://www.oodesign.com/liskov-s-substitution-principle.html Previous Comments: ------------------------------------------------------------------------ [2010-08-03 16:27:49] georgwaechter at googlemail dot com Hi Oliver, in my opinion you are absolutely right! I'm struggling with this "bug" for months now. The interface ArrayAccess is actually really useless until some serious php developers undestand that its essential that ArrayAccess objects behave like normal arrays. For modern object oriented programming this is simply a must. Enhanced this means that all array related functions work with those objects too. The current implementation is not complete. Greets Georg ------------------------------------------------------------------------ [2005-10-07 23:09:33] oliver dot graetz at gmx dot de Perhaps there shouldn't be afix for the reference issues since they are not meant to happen looking at the interface. But $data['element']['element2']="hi"; should definitely work! Perhaps a fix to look if the first part of this code is accessing an object instead of a real array has to be applied. An ordinary user sees nothing of a reference. Either fix this with ArrayAccess or completely yank the interface! I see a future where more and more framework code is pretending to be an array. If then users get this error message they won't understand the world. "It's an array!? Where's the reference? Why the *#?* isn't this working? I hate PHP5!" If you implement code so something can look like an array than it MUST be able to truely behave like an array. ------------------------------------------------------------------------ [2005-10-07 22:40:50] oliver dot graetz at gmx dot de Why did this work in 5.0.3 by using &offsetGet() and can't be made to work in 5.1? Why would changing the interface to read &offsetGet break anything other than the (up to now) few apps DEFINING it without the ampersand? 5.0 didn't complain about this at all and it worked. The issues caused by a simple change of the interface a far inferior to those caused by the "only variables can be passed by reference" some weeks ago. And you're avoiding more serious trouble in later versions when more and more applications are relying on the false behaviour? ------------------------------------------------------------------------ [2005-10-07 21:41:03] oliver dot graetz at gmx dot de Won't happen. I'm just a user of PHP. As a result, this is one more case where using a new feature becomes impossible by breaking BC (between 5.0 and 5.1). A yound and promising feature has to be left behind, ArrayAccess won't be in use any more in future projects by certain people since the desired behaviour can easily be achieved by using ordinary methods. Syntactic sugar going to hell. ------------------------------------------------------------------------ [2005-10-07 20:20:40] he...@php.net Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php Just to state this again: IT IS IMPOSSIBLE TO HAVE ARRAYACCESS DEAL WITH REFERENCES. If you don\'t like that statement i suggest you prove it wrong by writing a patch that actually works in all cases. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/bug.php?id=34783 -- Edit this bug report at http://bugs.php.net/bug.php?id=34783&edit=1