Como los objetos son pasados por referencia, para poder copiar un objeto, tenemos que clonarlo usando clone.
<?php
    
class Sheep {
        private 
$name;

        function 
__construct($name) {
            
$this->setName($name);
        }

        function 
setName($name) {
            
$this->name $name;
        }

        function 
getName() {
            return 
$this->name;
        }
    }

    
$wooly = new Sheep('wooly');
    
$dolly = clone $wooly;
    
$dolly->setName('dolly');

    echo 
"Esta ovejita es ".$wooly->getName()."<br />\n";
    echo 
"Y esta otra es ".$dolly->getName()."\n";
?>
... ejecutemos este código:
Esta ovejita es wooly<br />
Y esta otra es dolly
Si hay necesidad de mayor control, se tiene que implementar el método __clone(). Asi que el ejemplo anterior ahora sería:
<?php
    
class Sheep2 {
        public 
$type;
        private 
$name;

        function 
__construct($name) {
            
$this->type "original";
            
$this->setName($name);
        }

        function 
__clone() {
            
$this->type "clonada";}

        function 
setName($name) {
            
$this->name $name;
        }

        function 
getName() {
            return 
$this->name;
        }
    }

    
$wooly = new Sheep2('wooly');
    
$dolly = clone $wooly;
    
$dolly->setName('dolly');

    echo 
"Esta ovejita es ".$wooly->getName()." y es {$wooly->type}<br />\n";
    echo 
"Y esta otra es ".$dolly->getName()." y es {$dolly->type}\n";
?>
... y ahora obtenemos
Esta ovejita es wooly y es original<br />
Y esta otra es dolly y es clonada