面向?qū)ο缶幊?OOP)引入了相當(dāng)多的特性,使編程變得更加復(fù)雜,封裝、繼承、多態(tài)是OOP的三要素,這些是過(guò)程式中的函數(shù)所沒(méi)有的。
具體體現(xiàn)在:
1.封裝: class/interface/public/protected/private
2.繼承: extends/implements(推薦學(xué)習(xí):PHP編程從入門(mén)到精通)
3.多態(tài): 方法重寫(xiě)/方法重載
新增的class和interface加入了新的變量作用域,即類和接口里代碼塊是函數(shù)所沒(méi)有的作用域。
在這個(gè)作用域里,可以定義變量和函數(shù)這些類和接口的成員,并且支持使用public/protected/private關(guān)鍵字對(duì)這些成員進(jìn)行訪問(wèn)控制.比如public表示允許外部訪問(wèn),protected表示允許類及其子類訪問(wèn),private表示只允許所在類內(nèi)部訪問(wèn)。
類要有關(guān)鍵字class聲明,類有屬性和方法構(gòu)成,可以實(shí)例化出對(duì)象,類可以被繼承,一般類是面向?qū)ο缶幊虝r(shí)用到;函數(shù)沒(méi)有屬性,一般用在面向過(guò)程,為解決某一特定問(wèn)題而寫(xiě)的。
而且OOP還引入了方法重寫(xiě)和方法重載這些多態(tài)特性,即:
方法重寫(xiě):參數(shù)列表相同,方法體不同.
方法重載:參數(shù)列表不同,方法體不同.
方法重寫(xiě)依賴?yán)^承,是子類的方法覆蓋父類的方法,要求方法名和參數(shù)列表相同.
方法重載不依賴?yán)^承,是同一個(gè)類中的兩個(gè)或兩個(gè)以上的同名方法,參數(shù)列表不同.
需要注意的是繼承并重寫(xiě)的方法只能維持或放大訪問(wèn)權(quán)限,不能縮小.
比如父類protected方法在子類重載為public是可行的.
在PHP中,因?yàn)椴辉试S存在多個(gè)同名方法,所以不支持C++/Java那樣的方法重載.
但PHP提供了魔術(shù)方法(__call,__callStatic)用于間接實(shí)現(xiàn)方法重載.
PHP中方法重寫(xiě)并不要求參數(shù)相同.
PHP不支持多重繼承(繼承多個(gè)父類),但可以實(shí)現(xiàn)多個(gè)接口,也可以用trait特性間接支持多重繼承.
有些人認(rèn)為繼承會(huì)增加子類和父類的耦合,所以反對(duì)繼承,甚至有些新的編程語(yǔ)言如Go等,直接不支持繼承,而是使用組合來(lái)取代繼承.比如依賴注入,本質(zhì)上也是一種組合的思想,用于實(shí)現(xiàn)解耦.PHP中可以final修飾一個(gè)類,禁止這個(gè)類被繼承.