Re: 5dee3c11 break

From: Date: Tue, 06 May 2014 11:29:57 +0000
Subject: Re: 5dee3c11 break
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-73968@lists.php.net to get a copy of this message
Hi, On Tue, May 6, 2014 at 7:25 PM, Dmitry Stogov <dmitry@zend.com> wrote: > I didn't review you patch careful, but why do you need to call offsetGet() > when offsetExists() must be enough? > is it for empty()? > Mostly for empty(), yes. It fixes the expected empty() behaviour for $a['foo'] == 0 when using ArrayObject. This is further explained in this bug report: https://bugs.php.net/bug.php?id=66834 > Then you probably should implement it a way similar to > zend_std_has_dimension() in Zend/zend_object_handlers.c. > call offsetExists() and then offsetGet() if necessary. > That's already the case :) http://lxr.php.net/xref/PHP_TRUNK/Zend/zend_object_handlers.c#719 > > Thanks. Dmitry. > > > On Tue, May 6, 2014 at 2:31 PM, Tjerk Anne Meesters <datibbaw@php.net>wrote: > >> Hi Dmitry, >> >> On Tue, May 6, 2014 at 4:11 PM, Dmitry Stogov <dmitry@zend.com> wrote: >> >>> Hi Tjerk, >>> >>> your commit broke the code that worked fine before (still works in 5.5 >>> but broken in 5.6 and above). >>> It leads into infinity recursion until stack overflow. >>> >>> It must be fixed or reverted. >>> >> >> This has been mentioned by Jakub before and a fix to ZF2 has already been >> merged: >> >> https://github.com/zendframework/zf2/pull/6096 >> >> The previous code and my patch basically cannot coexist; it used to work >> in 5.6 before, but only by the "virtue" of an unfortunate implementation. >> >> I believe this is not the only 5.6 issue that ZF2 is dealing with, but if >> you feel that this breaks too many things for a 5.x release I suppose we >> can revert it in PHP-5.6 and keep it for PHP-6? >> >> Let me know. >> >> >>> Thanks. Dmitry. >>> >>> <?php >>> class Parameters extends ArrayObject { >>> public function __construct(array $values = null) { >>> if (null === $values) { >>> $values = array(); >>> } >>> parent::__construct($values, ArrayObject::ARRAY_AS_PROPS); >>> } >>> public function offsetGet($name) { >>> if (isset($this[$name])) { >>> return parent::offsetGet($name); >>> } >>> return null; >>> } >>> } >>> $x = new Parameters(); >>> var_dump($x['foo']); >>> $x['foo'] = 'bar'; >>> var_dump($x['foo']); >>> ?> >>> >> >> >> >> -- >> -- >> Tjerk >> > > -- -- Tjerk

« previous php.internals (#73968) next »