您的位置:首页 > 编程语言 > PHP开发

《深入php面向对象、模式与实践》读书笔记——Clone

2011-09-01 11:32 357 查看
如果度过java或者其他类的设计模式的书,那么这本书应该读起来很容易。简单记录下书中讲第四章里面的Clone。

/***********************************************
* @name             : clone.php
* @since version    : 1.0.0
* @date             : 2011/9/1
* @email            : outman@shibeike.net
***********************************************/

class CloneClassOne
{
public $cloneClassTwo;
public function __construct($cloneClassTwo)
{
$this->cloneClassTwo = $cloneClassTwo;
}

# for step: 2
public function __clone()
{
$this->cloneClassTwo = clone $this->cloneClassTwo;
}
}

class CloneClassTwo
{
public $cloneClassThree;
public function __construct($cloneClassThree)
{
$this->cloneClassThree = $cloneClassThree;
}

#for step: 2
public function __clone()
{
$this->cloneClassThree = clone $this->cloneClassThree;
}

}

class CloneClassThree{
public $vars;
public function __construct($vars)
{
$this->vars = $vars;
}
}

# 初始化
# step: 1 此时不再类里面加入 __clone() 方法
$classOne = new CloneClassOne(new CloneClassTwo(new CloneClassThree(5)));

# 将会输出值为 5
echo $classOne->cloneClassTwo->cloneClassThree->vars, '<br>';

# clone $classOne这个对象
$cloneClass = clone $classOne;

# 输出clone以后的值5
echo $cloneClass->cloneClassTwo->cloneClassThree->vars;

# 改变$classOne的值为6
$classOne->cloneClassTwo->cloneClassThree->vars = 6;

# 注意,此时CloneClassOne & CloneClassTwo中没有加入 __clone 方法
# 所以只是浅clone而已,所以此时的值会随着原来类成员对象的改变而改变
# 输出 6
echo $cloneClass->cloneClassTwo->cloneClassThree->vars, '<br>';

# add __clone method in CloneClassTwo & CloneClassOne
# step: 2
# change $classOne->vars' value
# 此时加入__clone 方法,进行深度克隆
# 改变原来的值,不会影响当前clone出来的对象

$classOne->cloneClassTwo->cloneClassThree->vars = 6;

# echo 5
echo $cloneClass->cloneClassTwo->cloneClassThree->vars, '<br>';


所以对对象clone的时候根据情况要注意,尤其是深层次的包含的时候,容易引发错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐