Date: 11/10/00
- Next message: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] RE: [PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Previous message: Rasmus Lerdorf: "Re: [PHP-DEV] PHP 4.0 Bug #7743: gd lib problems displaying dynamic images"
- In reply to: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Next in thread: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] RE: [PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Reply: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] RE: [PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
A simple fix would be:
<?php
class B {
function bb() {
global $a;
echo "b";
$a->aa();
}
}
class A {
function aa() {
echo "A";
}
}
function t() {
global $a;
$GLOBALS['a'] = new A;
$a->aa();
global $b;
$GLOBALS['b'] = new B;
$b->bb();
}
t();
?>
If new is returning a reference of course this example doesn't work. The
problem lies in the fact the global $a references the same data the real $a
uses. The previously posted example tells the local instance of $a and $b
to point to some other data and does not affect the real $a or $b.
There appears to be a trade-off here. Either allow people to use global as
in the example posted by Maximov or apply the patch as is. Allowing new to
return a reference is definitely needed. It is a bug that comprimises
enterprise level OO design and forces sloppy OO code in PHP.
One option might also be to use $obj = &new foo() Zeev pointed out that
this wouldn't work for passing doing something like bar(&new foo()) which is
a limitation I think we can live with. Dan Rodriguez <danjrod <email protected>>
also has created a patch to do that.
If the above option won't work than it appears we have to choose between
forcing poor OO design and modifying coding practices. In my opinion, good
design is far more important than changing coding practices.
Don't worry Andi. This bug hasn't started to annoy me... it's been annoying
me for 2 months and I'm hoping this can be rectified in 4.0.4. :)
Thanks,
Mike
-----Original Message-----
From: Kirill Maximov [mailto:kir <email protected>]
Sent: Friday, November 10, 2000 3:44 AM
To: Andi Gutmans
Cc: PHP Development; php-qa <email protected>
Subject: [PHP-DEV] Re: [PHP-QA] $obj = new foo() patch
Andi Gutmans wrote:
>
> Guys,
>
> I have submitted a patch to the Zend Engine which is considered
> experimental. It is supposed to fix the problem with the $obj = new foo()
> statement when the constructor of foo() assigns $this by reference to
other
> symbol table entries. Basically, the Zend Engine will explicitly assign
new
> foo() by reference to $obj because this is pretty much the only thing
which
> makes sense in this case.
> NOTE: If you do $obj2 = $obj1 = new foo(), "$obj2 = $obj1" will still
> assign by value and not by reference.
> This patch is only meant to fix this problematic bug which has about 5
> entries in the bugs database.
> Please check it out. If there are any problems/concerns with this bug it
is
> best to leave it out for 4.0.4 but it should not harm anyone's scripts.
> The following bugs are probably solved now: 6529, 6896, 7454, 7455, 7482
> Anyway, please grab a fresh CVS tree and check that your OOP code still
> works :)
> Thanks!
> Andi
This code doesn't work no more as it did before:
<?php
class B {
function bb() {
global $a;
echo "b";
$a->aa();
}
}
class A {
function aa() {
echo "A";
}
}
function t() {
global $a;
$a = new A;
$a->aa();
global $b;
$b = new B;
$b->bb();
}
t();
?>
Output should be AbA.
I get:
Ab
Fatal error: Call to a member function on a non-object in
/h/home/kir/public_html/a.php on line 18
--With best regards, Kirill Maximov QA team.
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: php-dev-unsubscribe <email protected> For additional commands, e-mail: php-dev-help <email protected> To contact the list administrators, e-mail: php-list-admin <email protected>
- Next message: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] RE: [PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Previous message: Rasmus Lerdorf: "Re: [PHP-DEV] PHP 4.0 Bug #7743: gd lib problems displaying dynamic images"
- In reply to: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Next in thread: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] RE: [PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Reply: Kirill Maximov: "[PHP-DEV] Re: [PHP-QA] RE: [PHP-DEV] Re: [PHP-QA] $obj = new foo() patch"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

