php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #7983 Odd behviour of $GLOBALS
Submitted: 2000-11-26 21:12 UTC Modified: 2000-12-19 06:14 UTC
From: arunas at anm dot org Assigned:
Status: Closed Package: Unknown/Other Function
PHP Version: 4.0.3pl1 OS: Redhat LInux 7.0
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: arunas at anm dot org
New email:
PHP Version: OS:

 

 [2000-11-26 21:12 UTC] arunas at anm dot 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.





Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-11-27 17:53 UTC] 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-12-19 06:14 UTC] stas@php.net
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.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 11:01:30 2024 UTC