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                                                    |
+----------------------------------------------------------------------------+

Attachment: bug.php
Description: application/httpd-php

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to