面向對象--php基礎知識筆記

概念php

面向對象程序設計是一種程序設計範型,同時是一種程序開發方法。它將對象最爲程序的基本單元,將程序和數據封裝其中,以提升軟件的重用性、靈活性、擴張性。面向對象的核心思想:對象、封裝、可重用性和可擴展性。數據庫

對象與數組關係編程

1) 對象轉化爲數組,數組也能轉換成對象數組

2) 數組是由鍵值對數據組成的,數組的鍵值對和對象的屬性/屬性值對十分類似緩存

3) 對象和數組的區別在於,對象還有一個指針,指向它所屬的類編輯器

類與對象的關係函數

1)類是定義了一系列的屬性和操做的模板,而對象則把屬性進行具體化,而後交給類處理優化

2)對象就是數據,對象自己不包含方法。可是對象有一個指針指向一個類,這個類裏能夠有方法spa

3)方法描述不一樣屬性所致使的不一樣表現設計

4)類和對象是不可分割的,有對象就一定有一個類和其對應

魔術常量

__LINE__:文件中當前行號

__FILE__:文件的完整路徑和文件名

__DIR__:文件所在的目錄

__FUNCTION__:函數名稱

__CLASS__:類的名稱

__TRAIT__:Trait的名字(php5.4新加)

__METHOD__:類的方法名。返回該方法被定義時的名字(區分大小寫)

__NAMESPACE__:當前命名空間的名稱(區分大小寫)

魔術方法

__construct:是一個構造方法,具備構造方法的類會在每次建立對象是先調用此方法,比較適合在使用對象以前作一些初始化工做。好比:屬性賦值、數據庫鏈接等

__destruct:是一個析構方法,會在某個對象的全部引用都被刪除或者當對象被顯示銷燬時執行

__set__get:是php內置的方法,動態的建立類屬性和方法。重載是指一個類中能夠定義參數列表不一樣但名字相同的多個方法

__call和__callStatic:當調用一個不可訪問的方法(未定義或者不可見)時,__call

會被調用。 不只能夠對方法進行動態的建立還能延遲綁定

__toString:echo打印對象體,對象就會自動調用它定義的__toString 方法,格式化輸出這個對象所包含的數據

繼承與多態

繼承的優缺點:繼承最大的有點是擴展簡單,缺點:破壞封裝性、緊耦合、使用不當可能違反現實世界的邏輯。

如何使用繼承

1)精心設計專門用於被繼承的類,繼承的抽象層應該比較穩定,通常不要多餘三層

2)對於不是專門用於被繼承的類,禁止其被繼承。使用final修飾符便可防止重要方法被非法覆寫,又能給編輯器尋找優化的機會

3)優先考慮用組合關係提升代碼的可重用性

4)子類是一種特殊的類型,而不僅是父類的一個角色

5)子類擴展,而不是覆蓋或者使父類的功能失效

6)底層代碼多用組合,頂層/業務層代碼多用繼承。底層組合能夠提升效率,避免對象臃腫。頂層代碼用繼承能夠提升靈活性,讓業務使用更方便

多態的意義:實際開發中,只要關心一個接口或基類的編程,而不關心一個對象所屬的具體類

多態總結

1)多態指同一類對象在運行時的具體化

2)php是弱類型語言,實現多態更簡單、更靈活

3)類型轉換不是多態

4)php中父類和子類存在繼承關係,子類沒法向上轉型爲父類,從而失去多態最典型的的特徵

5)多態的本質是if else,實現的層級不一樣

面向接口編程

接口概念

1)接口做爲一種規範和契約存在。做爲規範,接口應該保證可用性,做爲契約,接口應該保證可控性

2)接口只有一個聲明,一旦使用interface關鍵字,就應該實現它。接口自己什麼都不作,它能夠告訴咱們它能作什麼

3)php接口存在兩個不足,一是沒有契約限制,而是缺乏足夠多的內部接口

接口與抽象類之間的區別:

1)二者表達的概念不同。抽象類是一類事物的高度聚合,那麼對於繼承抽象類的子類來講,對於抽象類來講,屬於「是」的關係;而接口是定義行爲規範,所以對於實現接口的子類來講,相對於接口來講,是「行爲須要按照接口來完成」

2)抽象類在定義類型方法的時候,能夠給出方法的實現部分,也能夠不給出;而對於接口來講,其中所定義的方法都不能給出實現部分

3)繼承類對於二者所涉及方法的實現是不一樣的。繼承類對於抽象類所定義的抽象方法,能夠不用重寫,也就是說,能夠延用抽象類的方法;而對於接口類所定義的方法來講,在實現類中必需要給出相應的方法實現

4)在抽象類中,新增一個方法的話,繼承類中能夠不用做任何處理;而對於接口來講,則須要修改實現類,提供新定義的方法。 區別五,抽象類中能夠定義屬性,接口不可

反射

反射API的使用:

//實例化反射
$reflect = new ReflectionObject($object);

//獲取對象屬性列表
$props = $reflect->getProperties();

//獲取對象方法列表
$methods = $reflect->getMethods();

class函數:

get_class($obj):獲取對象屬性列表所屬的類

get_object_vars($obj):獲取對象屬性的關聯數組

get_class_vars(get_class($obj)):類屬性

get_calss_methods(get_class($obj)):返回由類的方法名組成的數組

反射的做用:善用反射能保持代碼的優雅和簡潔,但反射也會破壞類的封裝性,由於反射可使本不該該暴露的方法或屬性被強制暴露出來

面向對象設計的五大原則

單一職責原則(SRP)

含義:一個是避免相同的職責分散到不一樣的類中,另外一個是避免一個類承擔太多職責

優勢:減小類之間的耦合、提升類的複用性

使用場景:數據庫操做、緩存管理

接口隔離原則(ISP)

概述:代表客戶端不該該強迫實現一些他們不會實現的接口,應該把胖接口中的方法分組,而後用多個接口代替它,每一個接口服務於一個子模塊

如何遵照:

1)一個類對另一個的依賴性應當創建在最小的接口上(ISP能夠達到不強迫客戶依賴於他們不一樣的方法,接口的實現類應該只呈現爲單一職責的角色,ISP還能夠下降客戶之間的相互影響)

2)客戶端程序不該該依賴它不須要的接口

開發-封閉原則(OCP)

基本思想:open模塊的行爲必須是開放的、支持擴展的,而不是僵化的;closed在對模塊的功能進行擴展時,不該該影響或大規模的影響已有的程序模塊。一個模塊在擴張性方面應該是開放的而在更改性方面是封閉的

如何遵照:

1)在設計方面充分應用抽象和封裝的思想。一方面要在軟件系統中找出各類可能的可變因素,並封裝;另外一方面,一種可變因素不該當散落在多個不一樣的代碼模塊中,而應當被封裝到一個對象中

2)在系統功能編程實現方面應用面向接口的編程,當需求發生變化時,能夠提供該接口新的實現類,以求適應變化

替換原則(LSP)

概念:子類型必須可以替換掉他們的父類型,並出如今父類可以出現的任何地方

如何遵照:

1)父類的方法都要在子類中實現或者重寫,而且派生類只實現其抽象類中的聲明方法而不該當給出多餘的方法定義或實現

2)在客戶端程序中應該使用父類對象而不直接使用子類對象,這樣能夠實現運行期綁定

依賴倒置原則(DIP)

概念:父類不能依賴子類,他們都要依賴抽象類,抽象不依賴於具體,具體應該要依賴於抽象

如何遵照:

1)每一個較高層次都爲它所須要的服務提出一個聲明接口,較低層次類實現這個接口

2)每一個高層類都經過該抽象接口使用服務

相關文章
相關標籤/搜索