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] [email protected]
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