background image

returncall_user_func_array(array($this->address,$method),$arguments);

}

所谓聚合类,是指在类中以某种方式嵌人了其他的类,使得不论访问原始的类,还

是嵌人的类都很方便。其中需要记住的关键在于,$address 属性保存的是一个 Address 对

象。

通过这个类,下例中显示了在克隆相应对象时会出现什么问题。

克隆一个聚合类:

$rasmus=newPerson;

$rasmus->setName('Rasmus Lerdorf');

$rasmus->setCity('Sunnyvale');

$zeev=clone$rasmus;

$zeev->setName('Zeev Suraski');

$zeev->setCity('Tel Aviv');

print$rasmus->getName() .' lives in '.$rasmus->getCity() .'.';

print$zeev->getName() .' lives in '.$zeev->getCity() .'.';

Rasmus Lerdorf lives in Tel Aviv.

Zeev Suraski lives in Tel Aviv.

有意思吧。调用 setName()时没有问题是因为$name 属性是一个字符串,也就是说它在

传递时拷贝的是值。但是,因为$address 是一个对象,而对象拷贝的是引用,所以

getCity()

的结果出现了问题 让 Rasmus 搬到了 Tel Aviv  

这种形式的对象克隆被称为浅克隆,或者浅拷贝。相对地, 深克隆 指的是克隆所有

有关对象的克隆。这正是 PHP 4 中的克隆方法。

要在 PHP 5 中控制如何克隆对象,是通过在相应的类中实现一个__clone()方法来达成

的。如果这个方法存在,PHP 会允许 clone()覆盖默认的行为,如例下例所示。

在聚合类中适当地实现克隆:

classPerson {

// ... everything from before

publicfunction__clone() {

$this->address =clone$this->address;