ID: 8937
Updated by: derick
Reported By: [EMAIL PROTECTED]
Old-Status: Open
Status: Closed
Bug Type: Scripting Engine problem
Assigned To: 
Comments:

This isn't a bug, but a feature =)

If you use GLOBAL within a function it creates a reference to the orignal variabele, 
this reference is local to the function. SO if you unset() this variabele, you're only 
unsetting the reference (and thus not the GLOBAL variabele). This is documented 
behavior (from the unset() manual page):

   If a globalized variable is unset() inside of a function, only the
   local variable is destroyed. The variable in the calling environment
   will retain the same value as before unset() was called.

Previous Comments:
---------------------------------------------------------------------------

[2001-01-26 14:19:15] [EMAIL PROTECTED]
The mentioned workarround (unset($GLOBALS['x'])) dosn't work with my testscript.

The result is exactly the same as with the first version of my script. I really have 
GREAT TROUBLES to upgrade this old application to PHP4.

Result:

'/hugo/bla/fasel'
'/hugo/bla'
'/hugo'
DIR called with function test1(): Array ( [/hugo] => 1 [/hugo/bla] => 1 
[/hugo/bla/fasel] => 1 ) 
'/hugo/bla/fasel'
'/hugo/bla'
'/hugo'
DIR called with function test2(): Array ( [/hugo/bla/fasel/test] => 1 [/hugo] => 1 
[/hugo/bla] => 1 [/hugo/bla/fasel] => 1 ) 


Script:
<?

function test1 ($dir) {
GLOBAL $x;
        unset($GLOBALS["x"]);
        $x[$dir]=true;
        mydirname($dir);
}


function test2 ($dir) {
GLOBAL $x;
####### unset($x);   no unset!
        $x[$dir]=true;
        mydirname($dir);
}

function mydirname ($dir) {
GLOBAL $x;
        $dir=ereg_Replace('/[^/]*$','',$dir);
        if (!empty($dir)) {
                echo "'$dir'<br>"; flush();
                mydirname($dir);
                $x[$dir]=true;
        }
}

$dir="/hugo/bla/fasel/test"; # first char must be '/' !

unset($x);
test1($dir);
echo "DIR called with function test1(): "; print_r($x);

echo "<br>";

unset($x);
test2($dir);
echo "DIR called with function test2(): "; print_r($x);

?>


---------------------------------------------------------------------------

[2001-01-26 14:05:26] [EMAIL PROTECTED]
Of course I know that it is already documented. First mentioned in August 1999!

Havn't mentioned this, cause it is not relevant. A bug is bug, and the other tickets 
have been closed, but the bug was remaining.

4 (or more?) other guys had the same trouble with this behaviour. How many others 
havn't reported this bug? I know minimum 2 others, which havn't.

Sorry, but it IS a bug and a workarround is not a bugfix and my opinion is, that you 
make it too easy for yourself to change the state of this ticket to "closed".

But I will not change it for you. I'll respect your decission.


---------------------------------------------------------------------------

[2001-01-26 11:54:16] [EMAIL PROTECTED]
Thats thanks to Bjorn ;) Not my sig..

---------------------------------------------------------------------------

[2001-01-26 11:52:29] [EMAIL PROTECTED]
Have a closer look at

   http://bugs.php.net/bugs.php?id=1971

and the commentary of Zeev. You have to
use unset($GLOBALS["x"]);

-- 
Björn Schotte                        [EMAIL PROTECTED]
http://rent-a-phpwizard.de/          [EMAIL PROTECTED]



---------------------------------------------------------------------------

[2001-01-26 10:25:19] [EMAIL PROTECTED]
unset() in context with GLOBAL has a serious bug. This bug appeard,
when I changed a PHP3-program to PHP4. The problem is now,
that constructs like the following are several times in this old program.

Sorry, I haven't checked, if this problem is fixed in 4.0.4. If so, perhaps someone 
can tell me? TIA.

Think this problem depends Zend, cause ZEND_CHANGES tells me:

"unset() is no longer a function, but a statement.  It was never
documented as a function so the impact should be no bigger than nada."

I have made a test-case:

<?

function test1 ($dir) {
GLOBAL $x;
        unset($x);
        $x[$dir]=true;
        mydirname($dir);
}


function test2 ($dir) {
GLOBAL $x;
####### unset($x);   no unset!
        $x[$dir]=true;
        mydirname($dir);
}

function mydirname ($dir) {
GLOBAL $x;
        $dir=ereg_Replace('/[^/]*$','',$dir);
        if (!empty($dir)) {
                echo "'$dir'<br>"; flush();
                mydirname($dir);
                $x[$dir]=true;
        }
}

$dir="/hugo/bla/fasel/test"; # first char must be '/' !

unset($x);
test1($dir);
echo "DIRS called with function test1(): "; print_r($x);

echo "<br>";

unset($x);
test2($dir);
echo "DIRS called with function test2(): "; print_r($x);

?>

---------------------------------------------------------------------------

The remainder of the comments for this report are too long.  To view the rest of the 
comments, please view the bug report online.

Full Bug description available at: http://bugs.php.net/?id=8937


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to