猿问

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

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);


错过了年华
浏览 1419回答 1
1回答

程重吾

首先 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  (这里没变)
随时随地看视频慕课网APP
我要回答