php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #69784 bad variable reference
Submitted: 2015-06-09 11:25 UTC Modified: 2017-10-19 21:35 UTC
Votes:4
Avg. Score:4.2 ± 0.4
Reproduced:4 of 4 (100.0%)
Same Version:4 (100.0%)
Same OS:3 (75.0%)
From: artur at salonstron dot pl Assigned:
Status: Not a bug Package: Variables related
PHP Version: 5.6.9 OS: irrelevant
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: artur at salonstron dot pl
New email:
PHP Version: OS:

 

 [2015-06-09 11:25 UTC] artur at salonstron dot pl
Description:
------------
In the example below, the variable $d is assigned a reference to a local variable $a (in function test) despite the fact that variable was not returns by reference.

To fix this, you must either before returning the $a use the reset(), or inside test() use another variable.

Test script:
---------------
<?php
$a = array (
    1=>"a",
    2=>"b",
    3=>"c"
);
$d = test($a);
echo "d:<br />";
while(list($key, $val)=each($d))  {
    echo $val." ";
}

function test($a) {
    while(list($key, $val)=each($a)) {
        $a[$key] = $val . "t3";
    }

    return $a;
} 

Expected result:
----------------
d:
at3 bt3 ct3

Actual result:
--------------
d:

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2015-06-10 09:21 UTC] nikic@php.net
Sorry, I'm not sure I see what the issue is here. In test() you're modifying the internal array pointer (IAP) of $a and then returning $a (including the modified IAP). Then in the main script you assign this to $d (still with modified IAP that is at the end of the array) and try to iterate further with it - which fails. Isn't this how it is supposed to work?
 [2015-06-10 09:43 UTC] artur at salonstron dot pl
in previous versions of php script worked differently. The variable $d was assigned to different array with unmodified IAP.
It seems to me that it is a a bug because if I wanted to return a reference to the array, which is inside a function test() I would done it differently.
Sorry for my english, I hope that everybody understands what I mean.
 [2015-06-10 09:49 UTC] nikic@php.net
According to http://3v4l.org/L8GsZ this behavior has stayed the same for all PHP versions - apart from a short regression interval in PHP 7. Are you sure the code you tested on older versions wasn't in some way different?
 [2015-06-10 10:10 UTC] artur at salonstron dot pl
Currently I'm using: PHP Version 5.5.11 on windows. On most of my clients servers php version is 5.2-5.5. Recently, one of the servers has been updated to version 5.6.9 and the difference is just there.

See this example: http://phpbug.studiostron.eu/ its output of the same script + phpversion()
 [2015-06-10 10:14 UTC] artur at salonstron dot pl
Customer servers running on different Linux distributions.
 [2015-06-10 11:14 UTC] artur at salonstron dot pl
I run some other tests and it seems that on servers with php 5.2.* 5.3.* 5.4.* script works as I expected on servers with php 5.6.* it work different
 [2017-10-19 21:35 UTC] nikic@php.net
-Status: Open +Status: Not a bug
 [2017-10-19 21:35 UTC] nikic@php.net
Closing this, as the provided code behaves as intended. I can't say why you are observing different behavior on older versions, but the current behavior is definitely correct.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Dec 26 22:01:28 2024 UTC