|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #38118 unrelated error when using reference
Submitted: 2006-07-16 23:37 UTC Modified: 2016-03-20 18:09 UTC
From: public at grik dot net Assigned:
Status: Open Package: *General Issues
PHP Version: 5.2.0 OS: *
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2006-07-16 23:37 UTC] public at grik dot net
Slightly modifying a Harry Fuecks's sample from on implemening the ArrayAccess interface, I get some unrelated error.
Maybe it's a documentation bug again...

Reproduce code:

class Article implements ArrayAccess {
    public $title;
    function __construct($title) {
        $this->title = $title;
    function offsetSet($key, $value){
            $this->{$key} = &$value;
    function offsetGet($key){
            return $this->{$key};
    function offsetUnset($key){
    function offsetExists($offset) {
        return array_key_exists($offset,get_object_vars($this));

// Create the object
$A = new Article('SPL Rocks');

// Change the title using array syntax using reference
$str = 'SPL _really_ rocks';
$A['title'] =&$str;

// Check what it looks like again


Expected result:
Article Object
    [title] => SPL _really_ rocks

Actual result:
Fatal error:  Objects used as arrays in post/pre increment/decrement must return values by reference in test.php on line 27

There was no increment/decrement operations used.

It would be _much_ better if it would be allowed to write
    function offsetSet($key, &$value){...}


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2006-07-16 23:43 UTC] public at grik dot net
I am not allowed to define function offsetGet($key)as 
"function &offsetGet($key){...}"
to return the value by reference due to the requirements of the ArrayAccess interface.
 [2006-07-16 23:55 UTC]
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at and the instructions on how to report
a bug at

The '&' is because of inhereitance rules.

The second thing you encounter, the '&=' is an engine limitation.

Btw, both are pure engine issues, nothing todo with SPL.

Maybe you want this reopened as feature request. But then i suggest you provide at least some ideas where and how to document that ArayAccess cannot be used in modifying operators like '&='.

Either way you should try 5.2/HEAD first as we've put some work to get you a better error message.
 [2006-07-17 00:42 UTC] public at grik dot net
Thank you.

The problem of using reference in ArrayAccess class is pure practical. 
I have a set of rules and data fields - each field should be checked against it's rule (e.g. min, max).
I write the hierarchy of classes implementing the exact logic for each rule. The class instance should get the set of rule parameters and the data reference.
Then I interate over the management object (extends ArrayObject) with foreach and get the checking object as a value.

As result, I can make the rules to check the data regardless of it's type and source - scalar, array, resource. All I need is to write another class with the check logic.

The data may be large, and inability to use references may lead either to
- memory overconsumption 
- DDOS-insecure issue 
- having to refuse from abstration and write more code
 [2006-07-17 06:36 UTC]
Please try using this CVS snapshot:
For Windows:

 [2006-07-24 00:00 UTC] public at grik dot net
exactly the same error

[root@demo www]# php -v
PHP 5.2.0-dev (cli) (built: Jul 24 2006 02:54:55)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
[root@demo www]# php test.php

Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in /www/test.php on line 27
 [2016-03-20 13:06 UTC]
-Package: Feature/Change Request +Package: *General Issues
 [2016-03-20 13:06 UTC]
The error message has been changed to refer to "indirect modification" in 5.2.1, see

Nowadays it is also possible to return by reference from offsetGet, in which case this code is allowed:

However, the assignment has no reference-breaking semantics.
 [2016-03-20 18:09 UTC] public at grik dot net
круто, что вспомнили :)
PHP Copyright © 2001-2018 The PHP Group
All rights reserved.
Last updated: Sun Nov 19 01:31:42 2017 UTC