有的時候我們需要在一個項目里面,使用兩個或多個一樣的對象,如果你使用“new”關鍵字重新創建對象的話,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯,所以要根據一個對象完全克隆出一個一模一樣的對象,是非常有必要的,而且克隆以后,兩個對象互不干擾。
在PHP中我們使用“clone”這個關鍵字克隆對象;
~~~
1 <?
2 class Person
3 {
4 //下面是人的成員屬性
5 var $name; //人的名子
6 var $sex; //人的性別
7 var $age; //人的年齡
8
9 //定義一個構造方法參數為屬性姓名$name、性別$sex和年齡$age進行賦值
10 function __construct($name = "", $sex = "", $age = "") {
11 $this->name=$name;
12 $this->sex=$sex;
13 $this->age=$age;
14 }
15
16 //這個人可以說話的方法,說出自己的屬性
17 function say() {
18 echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
19 }
20 }
21
22 $p1 = new Person("張三", "男", 20);
23
24 //使用“clone”克隆新對象p2,和p1對象具有相同的屬性和方法。
25 $p2=clone $p1;
26 $p2->say();
27 ?>
~~~
PHP定義了一個特殊的方法名“__clone()”方法,是在對象克隆時自動調用的方法,用“__clone()”方法將建立一個與原對象擁有相同屬 性和方法的對象,如果想在克隆后改變原對象的內容,需要在__clone()中重寫原本的屬性和方法, “__clone()”方法可以沒有參數,它自 動包含$this和$that兩個指針,$this指向復本,而$that指向原本;
~~~
1 <?
2 class Person
3 {
4 //下面是人的成員屬性
5 var $name; //人的名子
6 var $sex; //人的性別
7 var $age; //人的年齡
8
9 //定義一個構造方法參數為屬性姓名$name、性別$sex和年齡$age進行賦值
10 function __construct($name = "", $sex = "", $age = "") {
11 $this->name=$name;
12 $this->sex=$sex;
13 $this->age=$age;
14 }
15
16 //這個人可以說話的方法, 說出自己的屬性
17 function say() {
18 echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
19 }
20
21 //對象克隆時自動調用的方法, 如果想在克隆后改變原對象的內容,需要在__clone()中重寫原本的屬性和方法
22 function __clone() {
23
24 //$this指的復本p2, 而$that是指向原本p1,這樣就在本方法里,改變了復本的屬性。
25 $this->name = "我是假的 $that->name";
26 $this->age = 30;
27 }
28
29 }
30
31 $p1 = new Person("張三", "男", 20);
32 $p2 = clone $p1;
33 $p1->say();
34 $p2->say();
35 ?>
~~~
上例輸出:
我的名子叫:張三 性別:男 我的年齡是:20
我的名子叫:我是假的張三 性別:男 我的年齡是:30
- 1.什么是面向對象
- 2.什么是類,什么是對象,類和對象這間的關系
- 3.什么是面向對象編程呢
- 4.如何抽象出一個類
- 5.如何實例化對象
- 6.如何去使用對象中的成員
- 7.特殊的引用this的使用
- 8.構造方法__construct()與析構方法__destruct()
- 9.封裝性(var與public,protected,private的關系)
- 10.__set(),__get(),__isset(),__unset()四個方法的應用
- 11.類的繼承
- 12.重載新的方法(parent::)
- 13.訪問類型(public,protected,private)
- 14.final關鍵字的應用
- 15.static和const關鍵字的使用(self::)
- 16.__toString()方法
- 17.克隆對象__clone()方法
- 18.__call()處理調用錯誤
- 19.抽象方法和抽象類(abstract)
- 20.PHP5接口技術(interface)
- 21.多態的應用
- 22.把對象串行化serialize()方法,__sleep()方法,__wakeup()方法
- 23.自動加載類 __autoload()函數