|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [2012-04-23 13:17 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Fri Oct 31 14:00:01 2025 UTC | 
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) } } } }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";