View Single Post
Old 11-05-2007, 11:59 AM   #1 (permalink)
Wildhoney
La Vida es Sueño
Advanced Programmer Top Contributor 
 
Wildhoney's Avatar
 
Join Date: Sep 2007
Location: Oldham
Posts: 2,182
Thanks: 88
Wildhoney is on a distinguished road
Using the Clone Construct to Clone an Object

Cloning an object is quite different than it was in PHP4. In PHP4 you simply assigned the object to a new object and it would clone it verbatim. With the release of PHP5, things got a little more complex but a lot more flexible. PHP5 offers the clone construct along with a magic method to control the cloning process.

The reason for cloning is quite simple, much like the process itself if I was to be truthfully honest. You would use cloning to reduce the amount of code. For instance, consider the following:

PHP Code:
$pObject1 = new Object();
$pObject1->setName('Adam');
$pObject1->setAddress('http://www.talkphp.com/');

$pObject2 = new Object();
$pObject2->setName('Karl');
$pObject2->setAddress('http://www.talkphp.com/'); 
Would everyone be in agreement with me on this if I said cloning would make life a little easier? All we are doing is modifying the name, whilst the address remains to be identical as the previous one. Suppose we do this instead:

PHP Code:
$pObject1 = new Object();
$pObject1->setName('Adam');
$pObject1->setAddress('http://www.talkphp.com/');

$pObject2 = clone $pObject1;
$pObject2->setName('Karl'); 
We've saved ourselves 1 line! Fantastic, you might say, but that's not the half of it! Well, perhaps around half. PHP5 also introduces the __clone magic method to give you a little control over the process as a whole. Suppose we want to change the name when the object is cloned to Karl, we could do it like the following, although this would only be useful if you wanted to set the name as Karl upon every clone:

PHP Code:
public function __clone()
{
    
$this->m_szName 'Karl';

Do you see what happened? No, nor did I because we have no output, but what the above code would achieve in theory is it sets the name to Karl and so when you clone the object, there's no need to call setName! And let's face it, anything that saves us a little time is well worth it in the short and long run.

Just a little mention of this before we say goodbye, in our clone call. Let me remind you:

PHP Code:
$pObject2 = clone $pObject1
We are cloning the object which was set from the following line:

PHP Code:
$pObject1 = new Object(); 
You do not clone the class itself because the class itself does not store the data for any new instances, or any attempts at a clone instance, whilst $pObject1 does.
__________________
The man who comes back through the Door in the Wall will never be quite the same as the man who went out.
Send a message via AIM to Wildhoney Send a message via MSN to Wildhoney Send a message via Yahoo to Wildhoney
Wildhoney is offline  
Reply With Quote