unset() side effects in functions

From: Date: Mon, 23 Apr 2007 11:04:46 +0000
Subject: unset() side effects in functions
Groups: php.general 
Request: Send a blank email to php-general+get-253511@lists.php.net to get a copy of this message
I'm doing some experimenting with the unset() (http://php.net/unset) language construct in a PHP 5.2.1 installation. I did not find any documentation on what happens to an identically named local variable's value after an unset is performed. Let me start with this example: <?php function dostuff() { $a = 4; echo ">in function (init): ".$a."<\n"; global $a; /*CHANGEME*/ unset($a); echo ">in function (after unset): ".$a."<\n"; $a = 3; echo ">in function (after local assign): ".$a."<\n"; } $a = 2; dostuff(); echo ">in page: ".$a."<\n"; ?> The output is:
in function (init): 4< in function (after unset): < in function (after local assign): 3< in page: 2<
So this basically means that the global $a is dereferenced by the unset() call and the local $a gets reinitialized. A different thing happens when we replace the /*CHANGEME*/ line with unset using the $GLOBALS[] array (the recommended way of unsetting a global variable from inside a function): unset($GLOBALS['a']); This time the output is:
in function (init): 4< in function (after unset): 2< in function (after local assign): 3< in page: <
Notice that after the unset statement the global $a is properly unset BUT the value of the local $a becomes 2, which was the value of the global $a at the function entry point. Are these behaviors documented somewhere or should't I rely on these unset() side effects at all in my code? Thanks, Robert

« previous php.general (#253511) next »