PHP 面向對象基礎知識

面向對象(OOP) object oriented programming

1.什麼是面向對象?
世間萬物都是對象,抽象的也是對象,可見的不可見的都是對象。
面向對象就是以人類的思維方式去構建代碼,讓讀者能夠更好的理解代碼。

面向對象的好處:代碼的 (可讀性,可用性,擴展性,穩定性,可維護性)

2.什麼是類?
定義了一件事物的抽象特點。類的定義包含了數據的形式以及對數據的操作。
數據的形式即是屬性。對數據的操作即是方法。

3.什麼是對象?
是類的實例。

4.面向對象的三要素:封裝、繼承、多態

訪問修飾符

1)public 公共的
所有的位置都可以使用。
2)protected 受保護的
只有類本身和他的子類可以使用
3)private 私有的
只有類本身可用

魔術方法:一共16種
構造方法:__construct()
會在類實例化的時候第一個執行。
析構方法:__destruct()
會在類銷燬的時候執行。
__call 方法,在訪問不存在的方法時候執行。
callStatic方法,在訪問不存在的靜態方法時執行。
get 在訪問一個不存在的屬性時執行。
set 在設置一個不存在的屬性時執行。
autoLoad 自動加載方法。
魔術常量:
1)
__ LINE__當前的行號 報錯的時候用的最多。
2)
__ FILE __ 當前文件的完整的路徑和文件名。
3)
__ DIR __ 當前文件所在的路徑
4)
__ FUNCTION __ 當前函數的名稱
5)
__ CLASS __ 當前的類名
6)
__ TRAIT __ trait 的名字(什麼是trait後面我們會專門講一下這個)
7)
__ METHOD __ 類的方法名
8)
__ NAMESPACE __ 當前的命名空間

PHP中繼承是個通過extends 關鍵字來實現,一個類只能繼承一個類。一個類可以被多個類繼承。如果想多繼承的時候就只能是鏈式繼承。這樣才能夠實現類似多繼承。PHP在5.3.0版本爲了提供一個更好的解決方案,引入了trait類。trait類就是爲了解決多繼承問題的。有了trait類,在類中就可以使用use來將trait類引入到類中,這樣就可以訪問trait類中的內容了。

PHP在繼承的問題中還會涉及到一個重寫的問題。就是當父類的方法在子類中出現時。表示子類重寫了父類的方法。那麼當trait類中的方法在優先級方面要高於父類,要低於當前類。那麼意味着,如果一個類繼承了父類的方法setName,引入了trait中也有setName方法,那麼這時候實例化當前類,使用setName則會去訪問trait中的setName 方法。

靜態(static):修飾符,靜態方法或者屬性是和類相關的方法,不屬於任何一個對象(實例)。靜態方法不能調用非靜態屬性和方法,不能使用關鍵字this.靜態方法和屬性可以用類名::來訪問,對於方法來說,可以使用實例化的對象加箭頭的方式來訪問類,對於屬性是不可以的。靜態方法中可以使用self或者static來訪問靜態的方法和靜態的屬性。

his、self、parent這個三個關鍵字:
This是指向當前對象(在靜態方法中不能夠使用this),self是指向當前類,主要用來訪問靜態變量和方法,在靜態方法中訪問,parent是指向了父類。

接口:interface 定義了類的實現方法的一種特殊的類

接口中只有沒有方法體的方法名和常量。接口不可以被實例化,只有實現接口的類纔可以被實例化。接口的方法都是公共的。

一個類要實現一個接口就必須將接口的所有方法都實現了。一個類可以實現多個接口。實現用implements關鍵字。

抽象類:PHP 5 支持抽象類和抽象方法。定義爲抽象的類不能被實例化。任何一個類,如果它裏面至少有一個方法是被聲明爲抽象的,那麼這個類就必須被聲明爲抽象的。被定義爲抽象的方法只是聲明瞭其調用方式(參數),不能定義其具體的功能實現。

重寫:就是子類的方法名和父類的相同,這樣的關係就被稱爲是重寫。
如果父類的方法有final修飾符時,則不能夠重寫。

接下來考慮一個問題,爲什麼要讓構造方法私有化:
如果一個類中他的構造方法是私有的,那麼意味着他不可以被正常的實例化,那這樣做又有什麼作用呢?如果一個類不能夠被實例化,那麼這個類裏面的方法和屬性就不可以被外界使用,這樣的話就沒有任何的作用。

這一種設計模式(單例):在實際應用當中,有很多的類不希望用戶不停的實例化(例如數據庫連接),如果限制代碼實例化,就通過將構造函數私有化來實現。當然__clone 方法也需要私有化,保證當前類不能被克隆。那麼如何實例化或者得到類的實例化呢?
就需要在類中寫一個靜態方法,通過靜態方法來獲取類的實例。如何去判斷類的實例是否被實例化過。就需要一個靜態變量將類的實例保存起來。只要判斷靜態變量的內容就可以確定類是否被實例,同時當類被實例化後也可以返回類的實例的地址。對應的單例模式的代碼如下:

class Db{
 	private function __construct(){
	//這裏的構造函數要用私有的
	}
	private function __clone(){
	//克隆方法也要設置成私有的
	}
	private static dbInstance; //創建一個私有的靜態變量來存儲實例化好的類。

	//創建一個公共的獲取實例的方法,通過靜態的訪問方式可以訪問到該方法,從而獲取到類的實例
	public function getInstance(){
	
		if (!self::$dbInstance instanceof self) {
			self::$dbInstance= new self();
		}
	
		return self::$dbInstance;
	
	}

}

以上的代碼就是實現一個類的單例模式。當然這裏面還有很多可以擴展的地方。就不一一展開來細說了。這裏主要想說一些這個設計模式的最核心的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章