好!欢迎访问迷津渡口 现在时间是:

迷津渡口

越感到迷惑 越接近真理

聚合类和深度克隆

聚合类是指在类中以某种方式嵌入了其他的类。

可以利用魔术方法__call访问原始的类方法,也可以直接定义相应的方法。

<?php

class Address {
    protected $city;
    protected $country;

    public function setCity($city) {$this->city=$city;}
    public function getCity() {return $this->city;}
    public function setCountry($country) {$this->country=$country;}
    public function getCountry(){return $this->country;}
}

class Person {
    protected $name;
    protected $address;

    public function __construct() {$this->address=new Address;}
    public function setName($name) {$this->name=$name;}
    public function getName() {return $this->name;}
    public function __call($method,$arguments) {
        if (method_exists($this->address,$method)) {
            return call_user_func_array(array($this->address,$method),$arguments);
        }
    }
}

$rasmus=new Person;
$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().".<br>";
print $zeev->getName().' lives in '.$zeev->getCity().".<br>";

在这个例子中,clone仅仅是默认的浅拷贝,$name可以覆盖,但$address需要明确的克隆才可以。

输出:

Rasmus Lerdorf lives in Tel Aviv.
Zeev Suraski lives in Tel Aviv.

在聚合类中实现深度克隆:

class Person {
    // ... 之前的所有代码
    public function __clone() {
        $this->address=clone $this->address;
    }
}

添加后,将实现深度克隆,所有属性都可以覆盖包含$address。

因此添加后的输出为:

Rasmus Lerdorf lives in Sunnyvale.
Zeev Suraski lives in Tel Aviv.


点赞1
   支持一下
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
 点赞
 签到
 表情
 图片
 代码
提交评论

清空信息
关闭评论
 00:00/00:00
我想和你虚度时光 - 花房姑娘(9)
  1. 恋恋风尘
  2. 恋恋风尘
  3. 恋恋风尘
  4. 恋恋风尘
  5. 恋恋风尘
  6. 恋恋风尘
  7. 恋恋风尘
  8. 恋恋风尘
  9. 恋恋风尘