1 回答
TA贡献2条经验 获得超0个赞
首先 print_r 不会输出对象的静态属性和方法
$obj = new MyCloneable();//实例化类对象,这个没什么好说的
$obj->object1 = new SubObject();//当实例化一个类时,构造方法__construct(){},会被自动调用,
此时:
$this->instance = ++self::instances;//静态成员属性instances先自增(与self::instances++不同),再赋值给instance,此时值为1,(也就是说 static $instances = 1)注意该值的变化
$obj->object2 = new SubObject();//这里同上 此时instance的值是2了 static $instances = 2;
所以print_r($obj)输出结果(关注instance的值):
对象object1里面的instance 的值是 1
对象object2里面的instance 的值是 2
接下来分析:$obj2 = clone $obj;//克隆一个对象,当克隆一个对象时,会自动调用该对象的__clone(){}方法
所以接下来 $obj该对象的克隆方法会被调用,$obj 是通过 new MyCloneable该类获得的,那么
__clone(){
$this->object1 = clone $this->object1;//该代码被调用
}
接着分析 $this->object1 = clone $this->object1;//该对象的成员属性object1 克隆自己 ,因此:
该成员属性object1的 克隆方法 也会被调用 (注意:object1 是一个对象,他是怎么来的?)
通过new SubObject该类获得的,所以
该对象的克隆方法是
public function __clone() {
$this->instance = ++self::$instances;//该代码被调用,上面解释过该代码了,static $instances = 3;
}
所以print_r($obj2);结果是:
对象object1里面的instance 的值是 3
对象object2里面的instance 的值是 2 (这里没变)
- 1 回答
- 2 关注
- 1418 浏览
添加回答
举报