ID: 25708
User updated by: cdragon at draconic dot com
Reported By: cdragon at draconic dot com
Status: Wont fix
Bug Type: Variables related
Operating System: Windows 2000 Server
PHP Version: 4CVS-2003-09-30 (stable)
New Comment:

Well, thank you for your quick (but rude) response.

It is certainly not useless (or stupid) to extract references to
globals. Extracting them without using the REFS flag creates deep
copies of every variable (if I understand things correctly), which is
very wasteful of resources. More importantly, you can't modify the
contents of a global string unless you extract with REFS or use an
alternate method. For example:

$var = "x";
print "var=$var<p>";

function extrTest() {
//global $var;
//extract($GLOBALS, EXTR_REFS);
//$GLOBALS["var"] = "y";
$var = "y";

Will print "var=x" instead of the desired "var=y" (which you can get
using any of the commented-out lines). Since there are obviously other
syntactic alternatives, I don't _have_ to use the REFS method.
However, I would certainly consider it a serious bug that you can cause
PHP to access violation and exhibit randomish, hard to diagnose errors
by doing something that actually _works most of the time_, serves a
valid purpose, seems like it should work (without knowing some things
about PHP's inner workings), and is not even cautioned against anywhere
in the doentation that I can find.

Previous Comments:

[2003-09-30 20:57:15] [email][/email]

In short: Don't do this.

Longer version: GLOBALS is special variable, using extract() on it is
a) pointless, b) stupid, c) useless.

GLOBALS references itself in it, when you try to extract it's contents
as references, you'll end up with circular references which of course
will cause a crash.


[2003-09-30 18:23:05] cdragon at draconic dot com

Using extract($GLOBALS, EXTR_REFS); can cause the left hand side of two
globals set "by-value" equal to one-another to become corrupted in the
$GLOBALS array. Hard to explain in English, but easier to see in the
code below.

Reproduce code:
$sortColumn = "Affinity";
// Using "$lastSortColumn = substr($sortColumn, 0);" fixes the bug
$lastSortColumn = $sortColumn;

print "sort=" . $GLOBALS['sortColumn'] . " lastsort=" .
$GLOBALS['lastSortColumn'] . "<p>";
print "sort=" . $GLOBALS['sortColumn'] . " lastsort=" .
$GLOBALS['lastSortColumn'] . "<p>";

function extractGlobs()
// Commenting out the line below fixes the bug. So does not using
the EXTR_REFS flag.

Expected result:
sort=Affinity lastsort=Affinity
sort=Affinity lastsort=Affinity

Actual result:
sort=Affinity lastsort=Affinity
sort=Affinity lastsort=

or, randomly, you get an access violation instead:

PHP has encountered an Access Violation at 02CFF32F
(the 02CFF32F is variable)


Edit this bug report at [url][/url]