php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #61826 offsetGet not used for non existed items with second level of depth (and more)
Submitted: 2012-04-23 13:17 UTC Modified: 2012-04-23 18:41 UTC
From: dohardgopro at gmail dot com Assigned:
Status: Not a bug Package: SPL related
PHP Version: 5.4.0 OS: linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: dohardgopro at gmail dot com
New email:
PHP Version: OS:

 

 [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

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2012-04-23 18:41 UTC] cataphract@php.net
-Status: Open +Status: Not a bug
 [2012-04-23 18:41 UTC] cataphract@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-24 07:43 UTC] dohardgopro at gmail dot com
And how can I implement such behavior for properties?
__get is not works
 [2012-04-24 07:51 UTC] 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-26 12:30 UTC] dohardgopro at gmail dot com
Anybody?
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Tue Jul 15 01:01:35 2025 UTC