什麼是類?什麼是物件?
類是由屬性和方法組成的抽象組織。
物件是類的具體存在。
PHP中都有哪些魔術方法?它們的作用分別是什麼?
PHP中由__(兩個下劃線)開頭的方法開頭的都是魔術方法(自定義的方法不屬於)。
常用的魔術方法有:
- __set($name,$value)
- __get($name)
- __call($name,$args)
- __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簡單實現了:
- 獲取類命
- 獲取類中的所有常量
- 獲取類中的所有屬性 (屬性名、屬性值、靜態屬性、許可權修飾符)
獲取類中的所有方法 (方法名、註釋、引數、靜態方法、許可權修飾符)
簡述繼承、多型和組合
繼承和多型同屬於物件導向的三大特徵之一。
繼承是指一個類透過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的異常處理機制
程式碼示例中使用了set_error_handler函式接管了PHP的內建錯誤處理方式。
在發成錯誤時由自定義錯誤處理方法手動丟擲一個異常,phper只需關心發生異常後的補救方式即可。
本作品採用《CC 協議》,轉載必須註明作者和本文連結