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
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
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

Add a Patch

Pull Requests

Add a Pull Request

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-2024 The PHP Group
All rights reserved.
Last updated: Sat Apr 27 03:01:29 2024 UTC