PHP: unset() und der Unterschied zwischen global und $GLOBALS
16.08.2012 in: PHP und Webdesign
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.