In PHP5 objects are no longer copied when assigned. Instead the object's handle is assigned (similar to a reference but not quite). So the behaviour is as expected. Cheers, Rob. On Mon, 2007-10-08 at 21:42 +0100, David Restall - System Administrator wrote: > Hi, > > I think I have discovered a bug in php5. If I haven't, I've discovered > a bug in the documentation or a bug in my brain. > > php -v :- > > PHP 5.2.3 (cli) (built: Jun 26 2007 15:38:48) > Copyright (c) 1997-2007 The PHP Group > Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies > > I've attached a code snippet for those that want to save it and try > running it and it's also pasted here :- > > """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" > <?php > > class Class_1 > { > private $Text; > > function __construct($Text) > { > $this->Text = $Text; > } > > function Set($Text) > { > $this->Text = $Text; > } > > function Display() > { > print $this->Text . "\n"; > } > } // End Class_1 > > class Class_2 > { > private $Text; > private $C1; > > function __construct($Text) > { > $this->Text = $Text; > > $this->C1 = new Class_1('From David'); > } > > function Set_C1($Text) > { > $this->C1->Set($Text); > } > > function Display() > { > print $this->Text . "\n"; > $this->C1->Display(); > } > } // End Class_2 > > print "Below is T1\n"; > > $T1 = new Class_1('Hello'); > $T1->Display(); > > print "Below is T2\n"; > $T2 = new Class_2('World'); > $T2->Display(); > > print "Copying T2\n"; > > $T3 = $T2; > > print "T2 Copied, original value is :-\n"; > > $T2->Display(); > > print "Copy of T2 (T3) value is :- \n"; > > $T3->Display(); > > print "Changing T3\n"; > > $T3->Set_C1("This clears Dave"); > > print "T3 Change complete, new value is :-\n"; > > $T3->Display(); > > print "Below is T2 which shouldn't have changed !!! \n"; > > $T2->Display(); > > // var_dump($T1); > > ?> > > """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" > > The output it produces is :- > > % php -e bug.php > Below is T1 > Hello > Below is T2 > World > >From David > Copying T2 > T2 Copied, original value is :- > World > >From David > Copy of T2 (T3) value is :- > World > >From David > Changing T3 > T3 Change complete, new value is :- > World > This clears Dave > Below is T2 which shouldn't have changed !!! > World > This clears Dave > % > > Now I would expect that $T2 would not change when I changed $T3. > Reading the documentation :- > > <http://www.php.net/manual/en/language.references.whatdo.php> > > "... Note: Not using the & operator causes a copy of the object to be > made. If you use $this in the class it will operate on the current > instance of the class. The assignment without & will copy the instance > (i.e. the object) and $this will operate on the copy, which is not > always what is desired. Usually you want to have a single instance to > work with, due to performance and memory consumption issues." > > This effectively states that $T3 is a 'COPY' of $T2 and $T3 works on the > copy, not the master yet in the above snippet, the copy and the master > have both been changed. Further documentation mentions that the copy > starts off as a reference and only becomes a copy when it is changed. > This doesn't seem to be happening. > > I found this because in my actual application I was using :- > Master.class > ... > $Clone = $this; > > $Clone->Do_Something; > > > and later in master.class I did :- > > $this->Do_Something_Else > > and php barfed with :- > > PHP Fatal error: Call to a member function Function_Name() on a non-object > > I had deleted the missing object in $Clone but not in the master (this > was the whole idea of working on $Clone - I didn't want to delete the > object in the master !!). > > I can't find anything similar in the bug database on php.net (but I may > be looking in the wrong place) and I can't believe that I'm the first > person to encounter this. > > Can anybody explain if this is a bug or if I have misunderstood the > documentation ? > > TTFN > > > > D > php/general-2007-10-08.tx php-general > +----------------------------------------------------------------------------+ > | Dave Restall, Computer Nerd, Cyclist, Radio Amateur G4FCU, Bodger | > | Mob +44 (0) 7973 831245 Skype: dave.restall Radio: G4FCU | > | email : dave@xxxxxxxxxxx Web : Not Ready Yet :-( | > +----------------------------------------------------------------------------+ > | Good salesmen and good repairmen will never go hungry. | > | -- R. E. Schenk | > +----------------------------------------------------------------------------+ > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php -- ........................................................... SwarmBuy.com - http://www.swarmbuy.com Leveraging the buying power of the masses! ........................................................... -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php