#23150 [Bgs]: Using global $x, while $x is already global behaves in an inconsistent way
| From: | gschlossnagle@php.net | Date: | Sat, 26 Apr 2003 22:03:37 +0000 |
| Subject: | #23150 [Bgs]: Using global $x, while $x is already global behaves in an inconsistent way | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-38485@lists.php.net to get a copy of this message | ||
ID: 23150
Updated by: gschlossnagle@php.net
Reported By: arattink at correct dot net
Status: Bogus
Bug Type: Feature/Change Request
Operating System: Linux 2.4.16-4GB-SMP
PHP Version: 4.3.1
New Comment:
p.s. this syntax works in php5.
Previous Comments:
------------------------------------------------------------------------
[2003-04-26 17:01:09] gschlossnagle@php.net
The problem is with using global in the global scope.
The manual clearly states that
global $x1;
is equivalent to
$x1 =& $GLOBALS['x1'];
If you rewrite you example with that code to:
<?
class X
{
var $f = 'PHP sucks';
};
$x1 = new X;
$x2 = new X;
$z1 = &$x1;
$z2 = &$x2;
{
$x1 =& $GLOBALS['x1'];
// global $x1;
$x1->f = 'PHP is OK!';
}
{
$x2->f = 'PHP is OK!';
}
echo "x1.f=".$x1->f."\n";
echo "x2.f=".$x2->f."\n";
echo "z1.f=".$z1->f."\n";
echo "z2.f=".$z2->f."\n";
?>
You can see that the problem is that $x1 gets redefined,
leaving $z1 a reference to the original $x1. Thus I'm
marking this bug bogus. The manual should probably be
updated to say that not only is calling global in the
global scope pointless, it may also not do what you think
it does.
BTW: your attitude (as demonstrated in 23365) is piss-poor.
PHP is a volunteer effort, calling someone 'ungrateful' for
requesting a reproducing testcase is uncalled for. If you
want to be a tool, I'd suggest fixing your own problems, or
switching to a non-volunteer supported where people are
paid to put up with your immature antics.
------------------------------------------------------------------------
[2003-04-26 16:34:16] pollita@php.net
Reclassifying to Feature Request.
Calling global in the global scope should not be done. It represents
poor coding practices, however if someone on the Zend team wants to
make this work (the basic problem is that the object is copied rather
than referenced) here's the guys official feature request.
------------------------------------------------------------------------
[2003-04-11 01:16:00] sniper@php.net
.
------------------------------------------------------------------------
[2003-04-11 01:15:50] sniper@php.net
Not bug, works just as expected. (Don't do this :)
------------------------------------------------------------------------
[2003-04-10 09:20:33] arattink at correct dot net
I would expect that using $x1->f = 1234; would work the
same if $x1 is declared explicitely as global or not, if
it is already global, but:
<?
class X
{
var $f = 'PHP sucks';
};
$x1 = new X;
$x2 = new X;
$z1 = &$x1;
$z2 = &$x2;
{
global $x1;
$x1->f = 'PHP is OK!';
}
{
$x2->f = 'PHP is OK!';
}
echo "x1.f=".$x1->f."\n";
echo "x2.f=".$x2->f."\n";
echo "z1.f=".$z1->f."\n";
echo "z2.f=".$z2->f."\n";
?>
shows this is not true. It seems that $z1 loses its
reference to $x1, even though $x1 is never reassigned.
Tested on php 4.2.2 and php 4.3.1, same results.
List of modules: does not apply to this problem.
Known workaround: don't do this... However, it can easily
happen by mistake (as it did in our case).
Yours sincerely,
Arnoud Rattink.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=23150&edit=1