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 關注
- 1452 瀏覽
添加回答
舉報