为了账号安全,请及时绑定邮箱和手机立即绑定

能给我讲讲这段代码是怎样运行吗?

能给我讲讲这段代码是怎样运行吗?

PHP
错过了年华 2017-04-05 23:23:07
class SubObject {     static $instances = 0;     public $instance;     public function __construct() {         $this->instance = ++self::$instances;     }     public function __clone() {         $this->instance = ++self::$instances;     } } class MyCloneable {     public $object1;     public $object2;     function __clone()     {                // 强制复制一份this->object, 否则仍然指向同一个对象         $this->object1 = clone $this->object1;     } } $obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj->object2 = new SubObject(); $obj2 = clone $obj; print("Original Object:\n"); print_r($obj); print("Cloned Object:\n"); print_r($obj2);
查看完整描述

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  (这里没变)


查看完整回答
反对 回复 2017-04-10
  • 1 回答
  • 2 关注
  • 1418 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信