#37046 [Opn->Asn]: foreach breaks static scope (works in 5.1)
| From: | derick@php.net | Date: | Wed, 12 Apr 2006 21:57:06 +0000 |
| Subject: | #37046 [Opn->Asn]: foreach breaks static scope (works in 5.1) | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-95713@lists.php.net to get a copy of this message | ||
ID: 37046
Updated by: derick@php.net
Reported By: karoly at negyesi dot net
-Status: Open
+Status: Assigned
Bug Type: Scripting Engine problem
Operating System: Linux
PHP Version: 4CVS-2006-04-12
-Assigned To:
+Assigned To: dmitry
New Comment:
Dmitry, please also fix this in PHP 4.4.
Previous Comments:
------------------------------------------------------------------------
[2006-04-12 14:07:26] karoly at negyesi dot net
Please fix in 4.x, too. Thanks.
------------------------------------------------------------------------
[2006-04-12 11:38:58] dmitry@php.net
Fixed in CVS HEAD and PHP_5_1.
------------------------------------------------------------------------
[2006-04-12 10:35:21] dmitry@php.net
The simplified example:
Reproduce code:
---------------
<?php
function s() {
static $storage = array(array('x', 'y'));
return $storage[0];
}
foreach (s('a') as $k => $function) {
echo "op1 $k\n";
if ($k == 0) {
foreach (s('a') as $k => $function) {
echo "op2 $k\n";
}
}
}
?>
Expected result:
----------------
op1 0
op2 0
op2 1
op1 1
Actual result:
--------------
op1 0
op2 0
op2 1
The bug is similar to bug #35106 (nested foreach fails when array
variable has a reference), but has different reason.
------------------------------------------------------------------------
[2006-04-12 00:08:05] karoly at negyesi dot net
I thought best is if I provide one script...
<?php
function s($key) {
static $storage = array('a' => array('x', 'y'));
return $storage[$key];
}
function s1($key) {
static $storage = array('a' => array('x', 'y'));
return (array)$storage[$key];
}
function s2() {
static $storage = array('x', 'y');
return $storage;
}
function invoke($op, $st) {
foreach ($st('a') as $k => $function) {
echo "$op $k\n";
$function($op, $st);
}
}
function x($op, $st) {
if ($op == 'op1') invoke('op2', $st);
}
function y() {
}
invoke('op1', 's');
echo "\n";
invoke('op1', 's1');
echo "\n";
invoke('op1', 's2');
?>
You get
op1 0
op2 0
op2 1
op1 0
op2 0
op2 1
op1 1
op1 0
op2 0
op2 1
op1 1
if this is not a bug then why they differ?
------------------------------------------------------------------------
[2006-04-11 23:01:21] karoly at negyesi dot net
I think this is still a bug. See my first comment -- that differs very
slightly and yet it works.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/37046
--
Edit this bug report at http://bugs.php.net/?id=37046&edit=1