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.