Edit report at http://bugs.php.net/bug.php?id=51992&edit=1

 ID:               51992
 User updated by:  andrewm dot finewolf at gmail dot com
 Reported by:      andrewm dot finewolf at gmail dot com
 Summary:          ArrayAccess and references
 Status:           Bogus
 Type:             Feature/Change Request
 Package:          SPL related
 Operating System: Irrelevant
 PHP Version:      Irrelevant

 New Comment:

And none of those where filled in "Feature/Change Request"...


Previous Comments:
------------------------------------------------------------------------
[2010-06-03 23:28:19] johan...@php.net

Please do not submit the same bug more than once. An existing
bug report already describes this very problem. Even if you feel
that your issue is somewhat different, the resolution is likely
to be the same. 

Thank you for your interest in PHP.

This limitation is subject of a few other bugs and discussions.

------------------------------------------------------------------------
[2010-06-03 23:19:13] andrewm dot finewolf at gmail dot com

Description:
------------
Arrays in PHP contains references to primitive types and reference
types. Which basically means that if you are post-incrementing an
element, well, it actually works.



Why is ArrayAccess::offsetGet() returns by value instead of by
reference? Wasn't ArrayAccess created to emulate an array? This is a
major inconsistency in the platform and makes this whole interface
pretty useless. This isn't an engine limitation. __get(), __set(),
__isset(), __unset() is returning values by reference without any
problems. Why can't ArrayAccess (when it does pretty much the same
thing?)



Can ArrayAccess::offsetGet() return by reference (or at the very least
create a second interface, "ArrayAccessRef", for this)?

Test script:
---------------
<?php

class ArrayTest implements ArrayAccess {

        private $container = array();



        public function offsetSet($name, $value) {

                $this->container[$name] = $value;

        }

        public function offsetExists($name) {

                return isset($this->container[$name]);

        }

        public function offsetUnset($name) {

                unset($this->container[$name]);

        }

        public function offsetGet($name) {

                return isset($this->container[$name]) ? $this->container[$name] 
:
null;

        }

}



class ObjectTest {

        private $container = array();



        public function __set($name, $value) {

                $this->container[$name] = $value;

        }

        public function __isset($name) {

                return isset($this->container[$name]);

        }

        public function __unset($name) {

                unset($this->container[$name]);

        }

        public function __get($name) {

                return isset($this->container[$name]) ? $this->container[$name] 
:
null;

        }

}



$array = array();

$array['counter'] = 0;

$array['counter']++;

echo $array['counter'] . "\n";



$objArray = new ArrayTest();

$objArray['counter'] = 0;

$objArray['counter']++;

echo $objArray['counter'] . "\n";



$objAccess = new ObjectTest();

$objAccess->counter = 0;

$objAccess->counter++;

echo $objAccess->counter . "\n";

Expected result:
----------------
1

1

1



Actual result:
--------------
1

0

1




------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=51992&edit=1

Reply via email to