Re: PHP7 / foreach / references / ugly code / discrepancy to PHP 5.6
| From: | David Zuelke | Date: | Wed, 11 Nov 2015 13:33:49 +0000 |
| Subject: | Re: PHP7 / foreach / references / ugly code / discrepancy to PHP 5.6 | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-89177@lists.php.net to get a copy of this message | ||
Should this be in the UPGRADING notes?
> On 10.11.2015, at 20:45, Nikita Popov <nikita.ppv@gmail.com> wrote:
>
> On Tue, Nov 10, 2015 at 5:48 PM, Philip Hofstetter <
> phofstetter@sensational.ch> wrote:
>
>> Hi,
>>
>> I'm having a cause of slightly ugly code that runs differently from PHP 5.6
>> to PHP 7 and I don't think this difference is documented, nor expected. As
>> I'm not sure whether this is an intended change or not, I'm asking here
>> firstr before making a bug report.
>>
>> The code in question is
>>
>> ----
>> $b = [1, 2, 3];
>>
>> foreach($b ?: [] as &$v){
>> $v = $v*2;
>> unset($v);
>> }
>>
>> var_dump($b);
>> ----
>> in PHP7, this produces
>>
>> array(3) {
>> [0] =>
>> int(1)
>> [1] =>
>> int(2)
>> [2] =>
>> int(3)
>> }
>>
>> whereas in PHP 5.6 and earlier, this produces
>>
>> array(3) {
>> [0] =>
>> int(2)
>> [1] =>
>> int(4)
>> [2] =>
>> int(6)
>> }
>>
>> what scares me about this is that in order to get the old behaviour in PHP7
>> back, you just have to get rid of the ?: operator:
>>
>> foreach($b as &$v){
>>
>> is fine
>>
>> foreach($b ?: [] as &$v){
>>
>> is not.
>>
>> I guess this is related to
>>
>>
>> http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.foreach.by-value
>> or
>>
>>
>> http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.foreach.by-ref
>> ,
>> but I'm not entirely sure whether this is actually intended behaviour -
>> it's certainly unexpected to me that applying ?: now always makes a copy
>> whereas before it didn't.
>>
>
> This is a bug in PHP 5, which has been fixed in PHP 7 as a side-effect of
> other changes. The new behavior is correct. This issue is tracked at
> https://bugs.php.net/bug.php?id=70857.
>
> Nikita