On Mon, Oct 04, 2004 at 09:39:16AM -0500, Bob Glamm wrote:
> I saw this behavior this morning and was curious if I'd tripped a bug
> in PHP (running version 4.3.7 at the moment).  I scanned through the
> bug list for this particular bug but didn't find it.  I'm running it
> by you all because I'm not intimately familiar with the reference
> system to really be sure that it's a bug and not just my misunderstanding.
> 
> A demonstration script is included below:
> globals $x and $v are set to NULL.  q() is called
> and references globals $x and $v.  $x is set to the new class X;
> $v is set to a reference to a new class Y (by means of a factory
> function in X, a common structure in PEAR).
> 
> My version of PHP prints NULL at the var_dump() statement immediately
> following the call to q(); I would expect it to dump an instance of
> class Y.  So: am I misunderstanding references (and if so, why is the
> behavior what it is), is this a duplicate
> of another known bug, is this bug fixed in a newer version of PHP,
> or should I file a new bug?
> 
> -Bob
> 
> <?php
> 
> class Y               // class created by factory in X, below
> {
>   function Y($t) { $this->a = $t; }
> }
> 
> class X
> {
>   function X() { }
> 
>   function &getY($t)  // factory method to create Y and return a ref to it
>   {
>     $k = new Y($t);
>     return($k);
>   }
> }
> 
> $x = null;
> $v = null;
> 
> function q()
> {
>   global $x, $v;

this makes a reference just like
$v =& $GLOBALS['v'];
would
 
>   $x = new X();               // get an X simply to acquire a Y
>   $v =& $x->getY("here");     // use the factory in X to assign a ref
>                               // to Y to the global $v

this overrides the old reference (the one to $GLOBALS['v']) with a new
(local) one.

this behaviour may look odd, but it is not a bug.

do "$GLOBALS['v'] =& $x->getY("here")" instead and $v will be assinged
as expected.

> }
> 
> q();                  // initialize the globals with X and &Y
> var_dump($v);         // should dump a Y, instead prints NULL ?
> 
> ?>
> 
> -- 
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php

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

Reply via email to