• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

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

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

首先 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该类获得的,所以
该对象的克隆方法是
publicfunction__clone(){
$this->instance=++self::$instances;//该代码被调用,上面解释过该代码了,static$instances= 3;
}
所以print_r($obj2);结果是:

对象object1里面的instance 的值是 3

对象object2里面的instance 的值是 2 (这里没变)

使用道具 举报

发新帖

发布任务需求已有1031168位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!