物件導向思想的核心概念

FrankTiao發表於2020-07-21

什麼是類?什麼是物件?

類是由屬性和方法組成的抽象組織。
物件是類的具體存在。

PHP中都有哪些魔術方法?它們的作用分別是什麼?

PHP中由__(兩個下劃線)開頭的方法開頭的都是魔術方法(自定義的方法不屬於)。

常用的魔術方法有:

  1. __set($name,$value)
  2. __get($name)
  3. __call($name,$args)
  4. __callStatic()

以上4個魔術方法的作用都是在物件呼叫不存在的屬性或方法時,使程式不會報錯的一種相容操作。
set和get作用於屬性
call作用於方法
callStatic作用於靜態方法

5. __toString()

toString方法相當於一種序列化方式,例如將一個物件使用toString方法轉換為一個字串,使用echo 輸出。
PHP中的序列化方法還有json_encode、serialize…它們本質上是相同的。

6. __construct()

初始化方法。
在例項化一個物件時會先呼叫此方法,常用於物件的初始化操作。
在PHP5.3.3之前初始化方法為與類命相同的方法,在5.3.3之後為了滿足相容性,如果類中沒有construct方法並且也沒有蔥父類繼承,PHP會嘗試尋找舊式方法。

7. __destruct()

析構方法。
在程式終止時呼叫。包括exit()或者die()

反射是什麼?反射的作用是什麼?

反射的簡單解釋是:根據到達地找到來源地。
物件導向程式設計賦予了物件的自省能力即反射API,透過反射可以獲取或匯出類,也可以獲取到類的方法、屬性包括註釋和私有。
so 反射常用於自動生成文件等。

反射的應用,實現一個簡單示例

github 程式碼示例
程式碼示例透過反射API簡單實現了:

  1. 獲取類命
  2. 獲取類中的所有常量
  3. 獲取類中的所有屬性 (屬性名、屬性值、靜態屬性、許可權修飾符)
  4. 獲取類中的所有方法 (方法名、註釋、引數、靜態方法、許可權修飾符)

簡述繼承、多型和組合

繼承和多型同屬於物件導向的三大特徵之一。
繼承是指一個類透過extends或其他關鍵字成為另一個類的子類。
多型是指同一個類的物件收到相同的訊息時會得到不同的結果。
組合是指透過屬性的方式得到某個物件。
繼承、組合和多型的意義歸根結底都是為了簡化程式碼提高複用性,不同的是繼承是用於類的複用,多型是用於方法的複用。
在PHP中多型的實現不是很好,原因在於PHP是一門動態語言,PHP本身就是多型。

繼承與組合的區別

繼承是一種“是,像”的關係;
組合是一種“需要”的關係;

繼承與組合的優劣勢

繼承的優點:

  • 大大簡化了程式碼

繼承的缺點:

  • 破壞了封裝性
  • 耦合度太高
  • 擴充套件時複雜性提高
  • 不恰當的使用會破壞現實世界的邏輯

so 在情況允許的前提下優先考慮組合

簡述PHP中的Interface

Interface即介面,其起到的主要為“契約、規範”的作用。
介面類似於抽象類,其沒有方法主體
被implements關鍵字實現的類必須實現介面中的所有方法。
“契約”作用也就是說介面中定義的方法實現類必須全部實現,否則會報錯。

但PHP中的介面沒有起到起到這樣的作用,例如呼叫一個介面不存在的方法PHP也不會報錯,所以顯得有點雞肋。

簡述PHP中的異常處理機制。

PHP將所有的程式異常都視作錯誤。
在PHP中所有的異常必須手動丟擲才會被捕獲到。

如何接管PHP內建的錯誤處理

透過set_error_handler()函式可以接管。
其定義如下

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

實現一個類Java的異常處理機制

github 程式碼示例

程式碼示例中使用了set_error_handler函式接管了PHP的內建錯誤處理方式。
在發成錯誤時由自定義錯誤處理方法手動丟擲一個異常,phper只需關心發生異常後的補救方式即可。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章