BlaBla.cn

Object cloning


Object cloning

Creating a copy of an object with fully replicated properties is not always the wanted behavior. A good example of the need for copy constructors, is if you have an object which represents a GTK window and the object holds the resource of this GTK window, when you create a duplicate you might want to create a new window with the same properties and have the new object hold the resource of the new window. Another example is if your object holds a reference to another object which it uses and when you replicate the parent object you want to create a new instance of this other object so that the replica has its own separate copy.

An object copy is created by using the clone keyword (which calls the object's __clone() method if possible). An object's __clone() method cannot be called directly.

$copy_of_object = clone $object;

When an object is cloned, PHP 5 will perform a shallow copy of all of the object's properties. Any properties that are references to other variables, will remain references. If a __clone() method is defined, then the newly created object's __clone() method will be called, to allow any necessary properties that need to be changed.

Example #1 Cloning an object

<?php
class  SubObject
{
    static 
$instances  0 ;
    public 
$instance ;

    public function 
__construct () {
        
$this -> instance  = ++ self :: $instances ;
    }

    public function 
__clone () {
        
$this -> instance  = ++ self :: $instances ;
    }
}

class 
MyCloneable
{
    public 
$object1 ;
    public 
$object2 ;

    function 
__clone ()
    {
        
// Force a copy of this->object, otherwise
        // it will point to same object.
        
$this -> object1  = clone  $this -> object1 ;
    }
}

$obj  = new  MyCloneable ();

$obj -> object1  = new  SubObject ();
$obj -> object2  = new  SubObject ();

$obj2  = clone  $obj ;


print(
"Original Object:\n" );
print_r ( $obj );

print(
"Cloned Object:\n" );
print_r ( $obj2 );

?>

The above example will output:

Original Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
Cloned Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)


   

 
BlaBla.cn

© 2005-2008 BlaBla.cn 版权所有