php protected 的继承,14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式...
類的繼承
簡(jiǎn)單理解:
某個(gè)類A具有某些特征,另一個(gè)類B,也具有A類的所有特征,并且還可能具有自己的更多的一些特征,此時(shí),我們就可以實(shí)現(xiàn):B類使用A的特征信息并繼續(xù)添加自己的一些特有特征信息。
基本概念繼承:一個(gè)類從另一個(gè)已有的類獲得其特性,稱為繼承。
派生:從一個(gè)已有的類產(chǎn)生一個(gè)新的類,稱為派生。
繼承和派生,其實(shí)只是從不同的方向(角度)來(lái)表述,本質(zhì)上就是一個(gè)事情。父類/子類:已有類為父類,新建類為子類。父類也叫“基類”,子類也叫“派生類”單繼承:一個(gè)類只能從一個(gè)上級(jí)類繼承其特性信息。PHP和大多數(shù)面向?qū)ο蟮恼Z(yǔ)言都是單繼承模式。C++是多繼承。擴(kuò)展:在子類中再來(lái)定義自己的一些新的特有的特性信息(屬性,方法和常量)。沒(méi)有擴(kuò)展,繼承也就沒(méi)有意義了
訪問(wèn)(權(quán)限)修飾符
在類中的成員,通常都可以在前面加上以下3個(gè)修飾符:
public:公共的,共有的,公開(kāi)的
protected:受保護(hù)的
private:私有的,
public公有的
用該修飾符修飾的成員,可以在“任何位置”使用(訪問(wèn))。
訪問(wèn)(使用)是這樣一個(gè)語(yǔ)法模式:
對(duì)象->成員;
類名::成員;
訪問(wèn)位置分為3個(gè):
1:某個(gè)類內(nèi)部:自然是該類的某個(gè)方法中
2:某個(gè)類的具有繼承關(guān)系的子(父)類的內(nèi)部:是指其他類的某個(gè)方法中。
3,某個(gè)類的外部:一般就是獨(dú)立的代碼區(qū)(不在類中),類似我們之前的代碼。
代碼演示如下:
類中只允許定義屬性與方法,不允許出現(xiàn)echo 這樣的使用。
子類可以在方法中直接訪問(wèn)父類的public 屬性
父類也可以訪問(wèn)子類的屬性
protected 受保護(hù)的
protected修飾的成員,可以在當(dāng)前類或當(dāng)前類的上下級(jí)具有繼承關(guān)系的類中訪問(wèn)。
private私有的
private 修飾的成員,只能在其所在的類中訪問(wèn)。
parent代表父類
對(duì)比:self代表“本類”(自己當(dāng)前類)
parent通常用于在子類中調(diào)用父類的成員的時(shí)候使用,多數(shù)通常就是使用父類的“靜態(tài)類”成員。
——因?yàn)?#xff50;arent代表的類,而非對(duì)象。
以下為parent關(guān)鍵字的2常見(jiàn)用法:
當(dāng)前的演示,用self,$this效果一樣
構(gòu)造方法析構(gòu)方法在繼承中的表現(xiàn)子類中沒(méi)有定義構(gòu)造方法時(shí),會(huì)自動(dòng)調(diào)用父類的構(gòu)造方法。因此實(shí)例化子類時(shí),需按照父類的構(gòu)造方法的形式進(jìn)行。
修改為:
子類定義了自己的構(gòu)造方法,則不會(huì)自動(dòng)調(diào)用父類的構(gòu)造方法,但可以手動(dòng)調(diào)用:parent::__construct();
但通常,在子類,很多時(shí)候,在構(gòu)造方法中,都應(yīng)該(需要)去調(diào)用父類的構(gòu)造方法以節(jié)省代碼,增加可讀性:
子類中沒(méi)有定義析構(gòu)方法時(shí),會(huì)自動(dòng)調(diào)用父類的析構(gòu)方法。
子類定義了自己的析構(gòu)方法,則不會(huì)自動(dòng)調(diào)用父類的析構(gòu)方法,但可以手動(dòng)調(diào)用:parent::__destruct()
重寫(xiě)override
重寫(xiě)又叫覆蓋,就是將從父類繼承下來(lái)的屬性或方法重新“定義”——就是從新寫(xiě)。
但注意:子類覆蓋父類的方法,雖然可以去調(diào)用父類的同名方法去完成一定的工作,但不是必須的。也有可能父類的該方法所執(zhí)行的結(jié)果并不適合子類,此時(shí)子類就去完全自己寫(xiě)了。
重寫(xiě)的基本要求:
訪問(wèn)控制權(quán)限:
下級(jí)的訪問(wèn)控制權(quán)限應(yīng)該不低于上級(jí)的訪問(wèn)控制權(quán)限:
上級(jí):public? 下級(jí):只能public
上級(jí):protected? 下級(jí): protected, public
上級(jí):private?? 下級(jí):private? protected?public——實(shí)際此情況無(wú)意義。
私有的不能覆蓋,而是完全當(dāng)作自己全新的。
方法的參數(shù)形式:
應(yīng)該跟父類的一致。
正確的做法:
更多參數(shù)也不對(duì):
私有屬性和私有方法的重寫(xiě)問(wèn)題:私有屬性和方法都不能覆蓋,但其實(shí)子類可以定義跟父類私有的同名屬性或方法。只是當(dāng)作一個(gè)自身的新的屬性或方法來(lái)看待而已。不過(guò)方法的參數(shù)必須一致。構(gòu)造方法的重寫(xiě)問(wèn)題:構(gòu)造方法不但可以像其他普通方法一樣重寫(xiě),而且,比普通方法更寬松:重寫(xiě)的時(shí)候參數(shù)可以不一致。
最終類final class:
通常,一個(gè)類,沒(méi)有特別聲明的話,則“別人”就可以隨意拿過(guò)來(lái)使用并對(duì)之進(jìn)行“擴(kuò)展”——繼承。
但是:
如果某個(gè)類不希望對(duì)其進(jìn)行擴(kuò)展,則可以將其聲明為“最終類”。
形式:
final? class? 類名{ 。。。。類定義。。。。}
最終方法final method
通常,一個(gè)方法,如果沒(méi)有特別聲明,則下級(jí)類就可以對(duì)其進(jìn)行“覆蓋”(重寫(xiě))。
但是:
如果某個(gè)方法不希望被下級(jí)類覆蓋,就可以對(duì)其生命為“最終方法”。
形式:
final? function?方法名(){。。。。方法定義。。。。}
設(shè)計(jì)模式
什么叫設(shè)計(jì)模式
所謂設(shè)計(jì)模式,就是一些解決問(wèn)題的“常規(guī)做法”,是一種認(rèn)為較好的經(jīng)驗(yàn)總結(jié)。面對(duì)不同的問(wèn)題,可能會(huì)有不同的解決辦法,此時(shí)就可以稱為不同的設(shè)計(jì)模式。
工廠模式
在實(shí)際應(yīng)用中,我們總是需要去實(shí)例化很多很多的類——以得到對(duì)象。
則:
我們可以設(shè)計(jì)出一個(gè)“工廠”(其實(shí)就是類),該工廠的作用(任務(wù))就是為人們“生產(chǎn)”各種對(duì)象。這種工廠通常只要指定類名,就可以據(jù)此獲取一個(gè)該類的對(duì)象。
復(fù)習(xí)點(diǎn):
類的繼承
基本概念:
繼承:從上級(jí)類獲取其特性信息(屬性和方法)的過(guò)程。B<<==A,B繼承自A
派生:A==>>B,從A派生出新的類B,B具有A的“幾乎所有特性”,并可以具有自己的特性。
父類/子類,基類/派生類,上級(jí)類,下級(jí)類。
單繼承:php中,類的繼承模式只能是從一個(gè)父類繼承。java,c#也都如此。
擴(kuò)展:B從A繼承了一些特性,并額外又加上了自己的一些特性,這種現(xiàn)象就可以稱為擴(kuò)展。
訪問(wèn)(權(quán)限)修飾符
在成員(屬性/方法/常量)前面,可以加上訪問(wèn)修飾符:public, protected, private
所謂訪問(wèn),就是類似這樣的語(yǔ)法形式:
對(duì)象->屬性/方法;
類::屬性/方法;
訪問(wèn)的位置(范圍)區(qū)別:
A一個(gè)類的內(nèi)部(肯定是方法內(nèi))
B一個(gè)類的繼承關(guān)系類的內(nèi)部(也是方法內(nèi))
C一個(gè)類的外部。
public公有的:
protected受保護(hù)的
private私有的
注意:
1,對(duì)于方法,如果省略訪問(wèn)修飾符,默認(rèn)按public算
2,對(duì)于普通屬性,不能省略,但var代表public
3,對(duì)于靜態(tài)屬性,可以省略,省略按public算
4,對(duì)于常量,默認(rèn)都是public
可以在子類中使用它,以此代表父類去訪問(wèn)父類中的成員。
parent::屬性,表示獲取父類的該屬性。
parent::方法():表示調(diào)用父類的該方法。此時(shí)就可能會(huì)出現(xiàn)一個(gè)情形:
該父類方法中,可能會(huì)用到$this關(guān)鍵字,表示“當(dāng)前對(duì)象”,但實(shí)際上此時(shí)表示的當(dāng)前對(duì)象,并非是父類的對(duì)象,而是調(diào)用該方法的子類的對(duì)象。
此用法通常用于子類覆蓋了父類的方法但又需要使用父類的同名方法的時(shí)候。
如果沒(méi)有定義,則他們都會(huì)自動(dòng)調(diào)用父類的同名方法。
如果定義了,則就不會(huì)自動(dòng)調(diào)用了,但可以在其中“手動(dòng)調(diào)用”,類似這個(gè)模式:
parent::__constuct(...)
parent::__destruct()
子類定義跟父類同名的屬性或方法,就是重寫(xiě)。
1,訪問(wèn)權(quán)限修飾不能低于父類(必須同樣級(jí)別或更開(kāi)放)
2,對(duì)于方法,其形參必須跟父類一樣。
final? class A{....}
finale? function? f1(){....}
設(shè)計(jì)模式就是應(yīng)用中面對(duì)某種特定情形的問(wèn)題而設(shè)計(jì)出來(lái)的某種常見(jiàn)的有效的解決辦法,是經(jīng)驗(yàn)的總結(jié)。
就是設(shè)計(jì)來(lái)專門“生產(chǎn)”類的對(duì)象的一種結(jié)構(gòu)模式。
設(shè)計(jì)模式
工廠模式:
總結(jié)
以上是生活随笔為你收集整理的php protected 的继承,14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php怎么弄自动填充,ThinkPHP
- 下一篇: java spring省略jsp,Jav