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.