Hey Rob,

even though I have never worked with that feature (nor have I even read about it), your explanation made the usage of unset() very clear, even to me... the german coder *g*

That's gonna go into my printed code folder :o) Thanks for the explanation!

Chris

----- Original Message ----- From: "Robert Cummings" <[EMAIL PROTECTED]>
To: "Robert Enyedi" <[EMAIL PROTECTED]>
Cc: <php-general@lists.php.net>
Sent: Monday, April 23, 2007 3:05 PM
Subject: Re: [PHP] unset() side effects in functions


On Mon, 2007-04-23 at 14:04 +0300, Robert Enyedi wrote:
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?

You are very confused as to what is happening. Unset() is working
properly.

<?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";
   }
?>

Let's break it down...

// create locale variable $a with value 4
$a = 4;

// create reference to global variable $a. This will destroy local
// variable $a and replace it with a reference to $GLOBALS['a']
global $a

// unset local variable $a (reference to $GLOBALS['a']. Now there is
// no variable $a in current scope (attempts to reference non-existent
// variables will return null.
unset( $a )

// create locale variable $a with value 3
$a = 3;

------------------------

Now for the other case...

// create locale variable $a with value 4
$a = 4;

// create reference to global variable $a. This will destroy local
// variable $a and replace it with a reference to $GLOBALS['a']
global $a

// unset $GLOBALS['a']. Now there is no global variable $a; HOWEVER,
// a reference exists to the original variable container, and so this
// has no effect on our reference to $GLOBALS['a'].
unset( $GLOBALS['a'] )

// create locale variable $a with value 3
$a = 3;

-----------------------

When thinking of references, don't think of the reference being made
directly to the variable itself, think of the reference being made to
the same data container as the variable referenced.

Imagine **X** is an imaginary name of the data container created when a
variable is created.

Let:

   $GLOBALS['a'] = 4;

Which is like:

   $GLOBALS['a'] --> **X** --> 4

Now assign a  reference:

   $b = &$GLOBALS['a'];

Which is like:

   $b --> **X** --> 4

Now unset $GLOBALS['a']:

   unset( $GLOBALS['a'] );

Which is like:

   $GLOBALS['a'] --> UNDEFINED!!

And we still have:

   $b --> **X** --> 4


Hope the helps.

Cheers,
Rob.
--
.------------------------------------------------------------.
| InterJinn Application Framework - http://www.interjinn.com |
:------------------------------------------------------------:
| An application and templating framework for PHP. Boasting  |
| a powerful, scalable system for accessing system services  |
| such as forms, properties, sessions, and caches. InterJinn |
| also provides an extremely flexible architecture for       |
| creating re-usable components quickly and easily.          |
`------------------------------------------------------------'

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to