php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #78475 Unsetting or assigning a value to $GLOBALS makes it stop working
Submitted: 2019-08-29 18:14 UTC Modified: 2021-04-14 10:08 UTC
From: ayg at aryeh dot name Assigned: nikic (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 7.3.9 OS:
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: ayg at aryeh dot name
New email:
PHP Version: OS:

 

 [2019-08-29 18:14 UTC] ayg at aryeh dot name
Description:
------------
$GLOBALS contains a reference to a magical array that has all the globals in it. Unsetting or assigning a value to it seems to forevermore lose the reference to this magical array, making $GLOBALS a regular old variable that has no connection to defined globals (although it's still a superglobal).

Unsetting or assigning to $GLOBALS probably should fail, just like $this does. I spent some time today trying to debug a scenario where $GLOBALS['someVar'] did not equal $someVar after I had written "global $someVar". It turned out to be because someone had unset $GLOBALS somewhere (they were trying to clear all global variables and restore them to an earlier state). This is really confusing and should be disallowed. Or at least produce a notice or something.

Test script:
---------------
$a = 1;
unset( $GLOBALS );
function f() {
  global $a;
  unset( $GLOBALS ); // $GLOBALS = []; is the same
  var_dump( $a );
  var_dump( isset( $GLOBALS['a' ) );
}
f();

Expected result:
----------------
Either:

int(1)
bool(true)

Or:

NULL
bool(false)

Actual result:
--------------
int(1)
bool(false)

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-04-14 10:08 UTC] nikic@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: nikic
 [2021-04-14 10:08 UTC] nikic@php.net
unset($GLOBALS) results in a compile-time error in PHP 8.1, as part of https://wiki.php.net/rfc/restrict_globals_usage.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Dec 12 17:01:31 2024 UTC