本節講解的內容
類與對象
類的構成
對象的建立
PHP記憶體回收機制
$this講解
前言
PHP是一個物件導向的程式設計語言,那麼什麼是物件導向呢?我們為什麼要物件導向呢?在我們的生活中有很多事物都是對象,比如一個杯子,一個盒子等,它們都有自己特有的特徵,它們都是對象。而我們在開發中的開發也是物件導向編程的。對象是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作對象。我們使用物件導向編程可以使我們看問題能夠看得全面,同時也有利於與資料的管理和維護,在PHP中物件導向可以分文兩類,一類是模子,創造對象使用,一類是對象,使用模子建立的起來的,那麼它們兩個有什麼關係呢?
類與對象
類與對象:具有相同特性(資料元素)和行為(功能)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的執行個體是對象,類實際上就是一種資料類型。
也就是說把對象的功能和特徵抽取出來,組成一個類,就好比把一個杯子的模型抽取出來,而我們可以根據這個模型(也就是類)去建立各種杯子(也就是對象)。
那麼類是怎麼定義的呢?對象又是怎麼建立的?
類的組成
<?php class Cat{ //定義一個貓類 public $name; //貓的名字 public $age;//貓的名字 public $color;//貓的顏色 //貓的構造方法 public function __construct(){ } public function sleep(){ echo '貓睡覺'; } public function eat(){ echo '貓吃飯'; } }
上面的就是一個類的基本結構,下面我們詳細的講解每個部分的意義。
類的屬性
屬性: 成員屬性是類的一個組成部分,一般是基礎資料型別 (Elementary Data Type)(整數,字串等),也可是複合類型(對象、數組) , 資源類型。比如我們前面定義貓類的public $age 就是成員屬性。
可以說每個類都有屬性,類的屬性是一類的特徵,比如說貓可以有名字,年齡,顏色等,這些貓類共有的特徵。在類中這種特徵我們稱之為屬性,當然我們也可以不定義屬性。這個看自己的需求。
屬性前面的public是一個許可權修飾符,在後面會有講解。
成員方法(函數)
在上面的代碼中可以看到在類中還有幾個函數,它們和前面的函數是一樣的,不過是前面多了一個許可權控制符。也可以叫做成員方法,這些成員方法就是類中的行為動作,比如上面的貓類,有睡覺這個行為,也有吃飯這個行為,當然你可以自己寫它有什麼行為。
成員方法的文法:
存取修飾詞 function 函數名(形式參數){ //函數體; //return 傳回值;}
存取修飾詞 , 有三種(public, protected, privte), 預設為public, 後面我們會詳解
其它部就和我們學的函數一樣了,包括調用機制
參數列表可以有多個,可以是任意類型
對於方法的傳回值,這個可以看具體需求。
成員方法是定義在類中的,如果定義在類外就不是這個類的行為了。
建構函式
上面的貓類中有一個方法,方法名是—__construct(),這是個建構函式,那麼什麼是建構函式?建構函式就是在建立對象的時候,進行初始化資料的方法,比如我們想在建立貓類對象的時候,直接把貓的名字、年齡和顏色給它,就可以使用到建構函式。
public function __construct($name,$age,$color){ $this-> name = $name; $this-> age = $age; $this-> color = $color;}
建構函式的文法是:
public function __construct(形式參數){ //函數體}
對於建構函式的方法名__construct(),這個是一個魔術方法,在後面有介紹,其實建構函式還有一種寫法,建構函式的方法名是類的名字:
public function Cat($name,$age,$color){}
上面的構造方法定義方式也是正確的,但是推薦使用魔術方法的那一種(__construct()),以為這樣當我們的類名發生改變的時候,不用修改。
注意PHP中類的名字不區分大小寫,但是我們還是要按大小寫來寫。同時建構函式是沒有傳回值的。
建構函式需要注意的是:
上面的三種情況就是類中大致的內容,在後續我們還會降類中的其他情況。
對象的建立
在上面建立對象的類已經有了,那麼怎麼建立對象呢?
對象建立方法
$cat = new Cat();
建立對象的文法是:
$對象名 = new 類名(參數1,參數2);
類名後面的括弧裡的參數是傳遞給類的建構函式的,如果建構函式沒有參數,可以不寫。
我們建立對象的目的就是需要操作對象,而操作對象,就是操作對象裡面的屬性和方法。
在上面的類下面寫如下代碼:
//建立對象,傳遞三個參數到建構函式。$cat = new Cat('小花',12,'black');//通過對象來訪問對象的屬性echo $cat -> name;echo '<br>';echo $cat -> age;echo '<br>';echo $cat -> color;echo '<br>';$cat-> sleep();$cat-> eat();.....結果......小花12black貓睡覺貓吃飯
上面的對象通過->訪問屬性和方法。注意屬性的前面沒有$符號。
$對象名->屬性名稱= 值;echo $對象名->屬性名稱;'-> ' 稱為對象運算子.
上面的就是對象的建立和最基本的應用
對象的傳遞類型
當我們把對象的值賦給另外一個變數是,是值傳遞還是引用傳遞?
//建立一個對象 $cat = new Cat('小花',12,'black'); $cat1 = $cat; // 把$cat這個對象賦給$cat1; $cat1 -> name = '小白';//利用$cat1這個對象修改對象的名字。 echo $cat1 -> name; //輸出$cat1對象的名字。 echo '<br>'; echo $cat -> name; //輸出$cat對象的名字。.....結果......小白小白
看到這裡可能有點蒙,不是值傳遞嗎?怎麼修改一個對象的屬性,另外一也變了?,
上面的代碼當中 $cat1=$cat也是值傳遞,但是這個值是對象的引用(可以理解物件識別碼),即每個包含對象的變數都持有對象的引(reference),而不是整個對象的拷貝。
在上面的圖中可以看到,當$cat賦值給$cat1時,也就是物件識別碼(#1)複製了一份,賦給$cat1,其實他們還是指向同一塊資料區,所以只要其中一個修改了值,另外一個也會變。
對象的銷毀
我們使用完對象後,已經確定在以後不會使用這個對象了,這個時候我們可以手動的銷毀對象,那麼我們怎麼讓對象銷毀呢?
當沒有任何變數指向對象時,會銷毀,因此我們可以把對象引用置為null
使用unset()函數來銷毀對象。
//建立一個對象$cat = new Cat('小花',12,'black');$cat -> sleep();unset($cat);$cat -> sleep();.....結果.....貓睡覺Notice: Undefined variable: cat in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27Fatal error: Call to a member function sleep() on null in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\object.php on line 27其實在一個檔案運行完的時候,PHP會啟動記憶體回收機制,自動的進行記憶體回收。這時候在裡面建立的對象就自動銷毀了,那麼什麼是PHP的記憶體回收機制?
PHP記憶體回收機制
記憶體回收,顧名思義,回收垃圾的,在程式中啟動記憶體回收機制的時機:
那麼什麼是記憶體回收機制?
記憶體回收機制是php5之後才有的,php5.3之前使用的記憶體回收機制是單純的“引用計數”,也就是每個記憶體對象都分配一個計數器,當記憶體對象被變數引用時,計數器+1;當變數引用撤掉後,計數器-1;當計數器=0時,表明記憶體對象沒有被使用,該記憶體對象則進行銷毀,記憶體回收完成。但是PHP5.3開始,使用了新的記憶體回收機制,在引用計數基礎上,實現了一種複雜的演算法,來檢測記憶體對象中引用環的存在(對象的相互引用),以避免記憶體流失。
$this說明
在上面寫類的建構函式的時候,可以看到在函數中使用到了$this,那麼在物件導向中$this是什嗎?
$this是在類中使用的訪問自身的一種機制。系統會給每個對象分配$this,代表當前對象。通俗的說就是在當前環境下,誰調用,$this就代表哪個對象。
<?php class Cat{ //定義一個貓類 public $name; //貓的名字 public $age;//貓的名字 public $color;//貓的顏色 //貓的定義方法 public function Cat($name,$age,$color){ $this-> name = $name; $this-> age = $age; $this-> color = $color; } public function sleep(){ echo '貓睡覺<br>'; } public function eat(){ echo '貓吃飯<br>'; } //輸出貓的資訊 public function info(){ echo '貓的名字是' . $this -> name . ' 年齡是' . $this-> age . ' 顏色是' . $this-> color; } } //建立一個對象 $cat = new Cat('小花',12,'black'); $cat -> info(); echo '<br>'; //建立另一個對象,傳進不同的屬性 $cat1 = new Cat('小白',6,'white'); $cat1 -> info(); .....結果.....貓的名字是小花 年齡是12 顏色是black貓的名字是小白 年齡是6 顏色是white
在上面的類中的info()函數中使用$this,不同的對象輸出不同的結果,因為在不同的環境下,誰調用,$this就代表哪個對象。
類的解構函式
在上面我們提到過,對象的銷毀,其實在類中有一個方法,就是在對象銷毀的時候由系統自動執行的。我們稱之為解構函式。
public function __destruct(){ echo $this->name . '被銷毀了<br>';}
在PHP5中引入了解構函式的概念,解構函式會在某個對象的所有引用被刪除(沒有變數指向對象,要被銷毀了),對象銷毀前執行。
解構函式的主要作用是去釋放對象分配的相關資源,比如資料庫連接或開啟的檔案等。
它的文法是:
function __destruct(){ //函數體[釋放資源,比如資料庫連接,或者開啟檔案等等]}
解構函式也是系統自動調用的,我們不用自己調。但是當我們沒有寫解構函式的時候,系統不會執行解構函式。
<?phpclass Cat{ //定義一個貓類 public $name; //貓的名字 public $age;//貓的名字 public $color;//貓的顏色 //貓的定義方法 public function Cat($name,$age,$color){ $this-> name = $name; $this-> age = $age; $this-> color = $color; } public function sleep(){ echo '貓睡覺<br>'; } public function eat(){ echo '貓吃飯<br>'; } //輸出貓的資訊 public function info(){ echo '貓的名字是' . $this -> name . ' 年齡是' . $this-> age . ' 顏色是' . $this-> color; } public function __destruct(){ echo $this->name . '被銷毀了<br>'; }}//建立一個對象$cat = new Cat('小花',12,'black');echo $cat -> name; //輸出對象的名字echo '<br>';unset($cat); //銷毀對象,系統自動調用解構函式。.....結果......小花小花被銷毀了
當我們銷毀對象$cat時,解構函式自動執行。
當我們一個檔案中建立了多個對象,在檔案執行完畢,銷毀對象的時候,是先建立的對象後銷毀,後建立的對象,先銷毀,這個原理和棧的原理很想,先進後出,後進先出。
總結
通過上面對類和對象的講解,我們可以知道類和對象的區別和聯絡。類是抽象的,代表著一類事物,如貓類。對象時具體的,代表一個具體事物。類是對象的模板,對象是類的一個個執行個體。同時類的基本構成要掌握。
以上就是PHP基礎教程九之類與對象的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!