> I think, and I could be completely wrong, that copying a variable actually
> creates a reference. The data is only copied when the variable referenced
is
> modified.
>
That's true.  What I left out of my explanation (in order to keep it simple)
is that when you "copy" a variable, a new label is created to point to the
same zval, and the zval's refcount is incrmented but the is_ref flag is
*not* set (I referred to this offhand as non-reference manner of multiple
labels referring to the same value).  Then when one of the referring labels
says "I want to change my `copy` of the data."  It notices that someone else
is also referring to this value (in a non-reference manner) and "separates"
the zval:  This amounts to making a true copy of the zval (with a refcount
of 1, and an is_ref of 0) and decrements the refcount of the original zval
(since one fewer label is referring to it).  This is the process known as
"copy on change".

$foo = 1;

/* $foo (label) ------>   1(value) (is_ref:0  refcount:1) */

$bar = $foo;

/*  $foo (label) ------->  1(value) */
/*  $bar (label) ---/        (is_ref:0 refcount:2) */

$foo = 2;

/* $bar (label) ------->  1(value) (is_ref:0  refcount:1) */
/* $foo (label) ------->  2(value) (is_ref:0  refcount:1) */

-Sara

Ya just had to make it complicated didn't you.

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to