Re: ArrayAccess::offsetGet not returning a ref

From: Date: Fri, 06 Aug 2010 14:22:30 +0000
Subject: Re: ArrayAccess::offsetGet not returning a ref
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-49212@lists.php.net to get a copy of this message
I can give 2 examples, one that triggers the problem, the other that is a real world issue: --- Simple: <?php interface I {
    public function foo($name);
} class C implements I {
    public function & foo($name) {}
} $c = new Bar(); running this produces: $ php -d error_reporting=32767 test-reference-in-signature.php PHP Fatal error: Declaration of C::foo() must be compatible with that of I::foo() in path/to/test-reference-in-signature.php on line 8 ---- Real world issue with ArrayAccess: <?php class SomeContainer implements ArrayAccess {
    protected $_data = array('foo' => array(1,2,3));
    public function & offsetGet($name) {
        $r = & $this->_data['foo'];
        return $r;
    }
    public function offsetSet($name, $value) {}
    public function offsetExists($name) {}
    public function offsetUnset($name) {}
} $b = new Bar(); $b['foo'][3] = 4; // implies Bar::offsetGet() happens before assign running this produces: $ php -d error_reporting=32767 test-reference-in-arrayaccess.php PHP Fatal error: Declaration of SomeContainer::offsetGet() must be compatible with that of ArrayAccess::offsetGet() in path/to/test-reference-in-arrayaccess.php on line 3 -ralph Stas Malyshev wrote:
Hi!
I'd opt for option (d) for all prototype/signature checking. Here's why:
I think relaxing the check may make sense. Do you have some code example that doesn't work and you want it to work?


« previous php.internals (#49212) next »