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:

And how can I implement such behavior for properties?
__get is not works


Previous Comments:
------------------------------------------------------------------------
[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

Reply via email to