物件導向程式設計(OOP)引入了相當多的特性,使程式設計變得更加複雜,封裝、繼承、多態是OOP的三要素,這些是過程式中的函數所沒有的。
具體體現在:
#1.封裝: class/interface/public/protected/private
# 2.繼承: extends/implements(推薦學習:PHP程式設計從入門到精通)
3.多態: 方法重寫/方法重載
新增的class和interface加入了新的變數作用域,即類別和介面裡程式碼區塊是函數所沒有的作用域。
在這個作用域裡,可以定義變數和函數這些類別和介面的成員,並且支援使用public/protected/private關鍵字對這些成員進行存取控制.例如public表示允許外部存取,protected表示允許類別及其子類別存取,private表示只允許所在類別內部存取。
類別要有關鍵字class聲明,類別有屬性和方法構成,可以實例化出對象,類別可以被繼承,一般類別是物件導向程式設計時用到;函數沒有屬性,一般用在面向過程,為解決某一特定問題而寫的。
而且OOP還引入了方法重寫和方法重載這些多態特性,即:
方法重寫:參數列表相同,方法體不同.
方法重載:參數列表不同,方法體不同.
方法重寫依賴繼承,是子類別的方法覆蓋父類別的方法,要求方法名稱和參數列表相同.
方法重載不依賴繼承,是同一個類別中的兩個或兩個以上的同名方法,參數列表不同.
需要注意的是繼承並重寫的方法只能維持或放大存取權限,不能縮小.
例如父類別protected方法在子類別重載為public是可行的.
在PHP中,因為不允許存在多個同名方法,所以不支援C /Java那樣的方法重載.
但PHP提供了魔術方法(__call,__callStatic)用於間接實作方法重載.
# PHP中方法重寫並不要求參數相同.
PHP不支援多重繼承(繼承多個父類別),但可以實現多個介面,也可以用trait特性間接支援多重繼承.
有些人認為繼承會增加子類別和父類別的耦合,所以反對繼承,甚至有些新的程式語言如Go等,直接不支援繼承,而是使用組合來取代繼承.例如依賴注入,本質上也是一種組合的思想,用於實現解耦.PHP中可以final修飾一個類別,禁止這個類別被繼承.
以上是php類別和函數的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!