Edit report at https://bugs.php.net/bug.php?id=61826&edit=1
ID: 61826 Comment by: dohardgopro at gmail dot com Reported by: dohardgopro at gmail dot com Summary: offsetGet not used for non existed items with second level of depth (and more) Status: Not a bug Type: Bug Package: SPL related Operating System: linux PHP Version: 5.4.0 Block user comment: N Private report: N New Comment: Anybody? Previous Comments: ------------------------------------------------------------------------ [2012-04-24 07:51:44] dohardgopro at gmail dot com Also I forgot something in my code (ARRAY_AS_PROPS) <? error_reporting(E_ALL); class OnEmptyArray extends ArrayObject { /** * Create ArrayObject on not existed offsets/keys */ public function offsetGet($offset) { if (!$this->offsetExists($offset)) { $this->{$offset} = new self(array(), $this->getFlags(), $this->getIteratorClass()); } return parent::offsetGet($offset); } } echo "Begin\n"; $a = new OnEmptyArray(array(), ArrayObject::ARRAY_AS_PROPS); $a->foo->bar = 1; echo "End\n"; ------------------------------------------------------------------------ [2012-04-24 07:43:46] dohardgopro at gmail dot com And how can I implement such behavior for properties? __get is not works ------------------------------------------------------------------------ [2012-04-23 18:41:26] cataphr...@php.net offsetGet() ins unrelated to property access. This works correctly: $ php -d display_errors=1 -d error_reporting=-1 <?php class OnEmptyArray extends ArrayObject { /** * Create ArrayObject on not existed offsets/keys */ public function offsetGet($offset) { if (!$this->offsetExists($offset)) { $this[$offset] = new self(array(), $this->getFlags(), $this->getIteratorClass()); } return parent::offsetGet($offset); } } echo "Begin\n"; $a = new OnEmptyArray(); $a['foo']['bar'] = 1; echo "End\n"; var_dump($a);^D Begin End object(OnEmptyArray)#1 (1) { ["storage":"ArrayObject":private]=> array(1) { ["foo"]=> object(OnEmptyArray)#2 (1) { ["storage":"ArrayObject":private]=> array(1) { ["bar"]=> int(1) } } } } ------------------------------------------------------------------------ [2012-04-23 13:17:16] dohardgopro at gmail dot com Description: ------------ If you overload offsetGet method, and return array from it, on non existed keys/offset, test script must works without warnings. Maybe because offsetGet not used, or PHP interpreter parse it from right-to-left, something like this (pseudo code): 1. $t = foo->bar = 1 2. $a = $t; Test script: --------------- <? error_reporting(E_ALL); class OnEmptyArray extends ArrayObject { /** * Create ArrayObject on not existed offsets/keys */ public function offsetGet($offset) { if (!$this->offsetExists($offset)) { $this->{$offset} = new self(array(), $this->getFlags(), $this->getIteratorClass()); } return parent::offsetGet($offset); } } echo "Begin\n"; $a = new OnEmptyArray(); $a->foo->bar = 1; echo "End\n"; Expected result: ---------------- Begin End Actual result: -------------- Begin PHP Warning: Creating default object from empty value in - on line 20 End ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=61826&edit=1