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 : [EMAIL PROTECTED] Web : Not Ready Yet :-( |
+----------------------------------------------------------------------------+
| Good salesmen and good repairmen will never go hungry. |
| -- R. E. Schenk |
+----------------------------------------------------------------------------+
bug.php
Description: application/httpd-php
-- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php

