abstract class Prototype { private $_id = null; public function __construct($id) { $this->_id = $id; } public function getId() { return $this->_id; } public function __clone() { //magic function $this->_id += 1; } public function getClone() { return clone $this; } } class ConcretePrototype extends Prototype { } $objPrototype = new ConcretePrototype(0); $objPrototype1 = clone $objPrototype; echo $objPrototype1->getId() . "\n"; $objPrototype2 = $objPrototype; echo $objPrototype2->getId() . "\n"; $objPrototype3 = $objPrototype->getClone(); echo $objPrototype3->getId() . "\n";