PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval)。
在Zval中仅存储对象的指针而不是内容(value)。当我们复制一个对象或者将一个对象当作参数传递给一个函数时,我们不需要复制数据。仅仅保持相同的对象指针并由另一个zval通知现在这个特定的对象指向的Object Store。由于对象本身位于Object Store,我们对它所作的任何改变将影响到所有持有该对象指针的zval结构----表现在程序中就是目标对象的任何改变都会影响到源对象。这使PHP对象看起来就像总是通过引用(reference)来传递,因此PHP5中对象默认为通过“引用”传递,不再需要像在PHP4中那样使用&来声明
class one{
public $name;
function __construct($name){
$this->name = $name;
}
public function demo(){
echo $this->name;
}
public function setName($newName){
$this->name = $newName;
}
function __clone(){
$this->name = "HAHA";
}
}
$a = new one('ajia');
//$b = $a; //对象复制是引用复制,会互相影响
$b = clone $a; //__clone方式的对象复制就不会互相影响
$a->setName('youxi');
//$b->setName('123');
$b->demo();