toscho.design

PHP: unset() und der Unterschied zwischen global und $GLOBALS

Arbeitet man mit schlecht organisiertem Code (hallo WordPress!), so stolpert man gelegentlich über globale Variablen. Die lassen sich leichter ändern als zerstören.

Codebeispiel

header( 'Content-Type: text/plain;charset=utf-8' );
error_reporting( E_ALL | E_STRICT );
function failed_unset()
{   // Copy the variable to the local namespace.
    global $foo;
    // Change the value.
    $foo = 2;
    // Remove the variable.
    unset ( $foo );
}
function successful_unset()
{
    // Remove the global variable
    unset ( $GLOBALS['foo'] );
}
$foo = 1;
print "Original: $foo\n";
failed_unset();
print "After failed_unset(): $foo\n";
successful_unset();
print "After successful_unset(): $foo\n";

Ergebnis

Original: 1
After failed_unset(): 2
Notice: Undefined variable: foo in /srv/www/htdocs/global-unset.php on line 21
Call Stack:
    0.0004     318712   1. {main}() /srv/www/htdocs/global-unset.php:0
After successful_unset():

Wie wir sehen, weiß unset() nichts von der globalen Variable, wenn wir nicht explizit $GLOBALS ansprechen. Das $foo = 2; wurde hingegen in den globalen Namensraum zurücktransportiert.

Fazit

  • Vermeide globale Variablen. Deren Herkunft, Typ und Genese sind schwer zu verfolgen. Sie verhalten sich nicht intuitiv.
  • Wenn du doch globale Variablen benutzt, dann immer in der langen Schreibweise $GLOBALS['foo'] – es sei denn, du möchtest nur die lokale Kopie zerstören.
  • $GLOBALS['foo'] sieht häßlich aus, und es ist etwas umständlicher zu tippen. Das ist gut so, denn schlechter Code soll schlecht aussehen.