PHP 4.0 Bug #7983 Updated: Odd behviour of $GLOBALS

From: Date: Tue, 19 Dec 2000 11:14:52 +0000
Subject: PHP 4.0 Bug #7983 Updated: Odd behviour of $GLOBALS
Groups: php.dev 
Request: Send a blank email to php-dev+get-41836@lists.php.net to get a copy of this message
ID: 7983 Updated by: stas Reported By: arunas@anm.org Old-Status: Open Status: Closed Bug Type: Unknown/Other Function Assigned To: Comments: All examples work correctly for me with latest CVS. Please try latest snapshot at snaps.php.net and reopen if it still happens for you. Previous Comments: --------------------------------------------------------------------------- [2000-11-27 17:53:24] joey@php.net Well, part of this behavior is really not all that mysterious. global $Piano; This create a local variable $Piano, and makes it a reference to $GLOBALS["Piano"]. Unsetting $Piano does nothing more than break that reference, as is documented in the incompatibilities list (http://www.php.net/version4/incompatibilities.php) --------------------------------------------------------------------------- [2000-11-26 21:12:46] arunas@anm.org I don't always know how variable arrives in a script. To be general, I have a function ClearVar($Name) that accepts the name of a variable, and goes through all of the global arrays to clear it. This appears to work properly with HTTP_GET_VARS and HTTP_POST_VARS, but the GLOBALS array is a funny fish. In fact, playing around to try to figure it out, I tried: $Piano = "Hemmingway"; print "Before: Piano = $Piano<br>n"; unset($GLOBALS["Piano"]); print "After: Piano = $Piano<br>n"; Which outputs: Before: Piano = Hemmingway After: Piano = ô®0Èõÿ¿ or some variant of that. More surprisingly, if I use unset on an element of the GLOBALS array within a function even odder things happen. The following code: $Piano = "Hemmingway"; print "Before: Piano = $Piano<br>n"; ClearTest(); print "After: Piano = $Piano<br>n"; $Piano = "Brahmbach"; print "Before: Piano = $Piano<br>n"; ClearTest(); print "After: Piano = $Piano<br>n"; function ClearTest() { global $Piano; print "Before[ClearTest]: Piano = $Piano<br>n"; MyClearVar("Piano"); print "After[ClearTest]: Piano = $Piano<br>n"; } function MyClearVar($Name) { unset($GLOBALS[$Name]); } Produces the following: Before: Piano = Hemmingway Before[ClearTest]: Piano = Hemmingway After[ClearTest]: Piano = Hemmingway After: Piano = |6( Before: Piano = Brahmbach Before[ClearTest]: Piano = After[ClearTest]: Piano = After: Piano = Brahmbach So apparently not all is simple with $GLOBALS. There maybe something I'm missing, I may be abusing a convenience method, but boy are the results strange. --------------------------------------------------------------------------- Full Bug description available at: http://bugs.php.net/?id=7983

« previous php.dev (#41836) next »