PHP中面向?qū)ο蟪?嫉闹R點有以下7點,我將會從以下幾點進行詳細(xì)介紹說明,幫助你更好的應(yīng)對PHP面試??嫉拿嫦?qū)ο笙嚓P(guān)的知識點和考題。
整個面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉及的內(nèi)容模塊有:
- 一、面向?qū)ο笈c面向過程有什么區(qū)別?
- 二、面向?qū)ο笥惺裁刺卣鳎?/li>
- 三、什么是構(gòu)造函數(shù)和析構(gòu)函數(shù)?
- 四、面向?qū)ο蟮淖饔糜蚍秶心膸追N?
- 五、PHP 中魔術(shù)方法有哪些?
- 六、什么是對象克???
- 七、this、self和parent的區(qū)別是什么?
- 八、抽象類與接口有什么區(qū)別與聯(lián)系?
- 九、PHP面向?qū)ο蟮某?济嬖囶}講解
關(guān)于PHP面向?qū)ο蟮膬?nèi)容將會被分為三篇文章進行講解完整塊內(nèi)容,第一篇主要講解一到四點內(nèi)容,第二篇主要講解五到八的內(nèi)容,第三篇圍繞第九點進行講解。
以下正文的內(nèi)容都來自《PHP程序員面試筆試寶典》書籍,如果轉(zhuǎn)載請保留出處:
一、面向?qū)ο笈c面向過程有什么區(qū)別?
面向?qū)ο笫钱?dāng)今軟件開發(fā)方法的主流方法之一,它是把數(shù)據(jù)及對數(shù)據(jù)的操作方法放在一起,作為一個相互依存的整體,即對象。對同類對象抽象出其共性,即類,類中的大多數(shù)數(shù)據(jù),只能被本類的方法進行處理。類通過一個簡單的外部接口與外界發(fā)生關(guān)系,對象與對象之間通過消息進行通信。程序流程由用戶在使用中決定。例如,站在抽象的角度,人類具有身高、體重、年齡、血型等一些特稱,人類會勞動、會直立行走、會吃飯、會用自己的頭腦去創(chuàng)造工具等這些方法,人類僅僅只是一個抽象的概念,它是不存在的實體,但是所有具備人類這個群體的屬性與方法的對象都稱為人,這個對象人是實際存在的實體,每個人都是人這個群體的一個對象。
而面向過程是一種以事件為中心的開發(fā)方法,就是自頂向下順序執(zhí)行,逐步求精,其程序結(jié)構(gòu)是按功能劃分為若干個基本模塊,這些模塊形成一個樹狀結(jié)構(gòu),各模塊之間的關(guān)系也比較簡單,在功能上相對獨立,每一模塊內(nèi)部一般都是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成,其模塊化實現(xiàn)的具體方法是使用子程序,而程序流程在寫程序時就已經(jīng)決定。例如五子棋,面向過程的設(shè)計思路就是首先分析問題的步驟:第一步,開始游戲;第二步,黑子先走;第三步,繪制畫面;第四步,判斷輸贏;第五步,輪到白子;第六步,繪制畫面;第七步,判斷輸贏;第八步,返回步驟二;第九步,輸出最后結(jié)果。把上面每個步驟用分別的函數(shù)來實現(xiàn),就是一個面向過程的開發(fā)方法。
具體而言,二者主要有以下幾個方面的不同之處。
1)出發(fā)點不同。面向?qū)ο笫怯梅铣R?guī)思維方式來處理客觀世界的問題,強調(diào)把問題域的要領(lǐng)直接映射到對象及對象之間的接口上。而面向過程方法則不然,它強調(diào)的是過程的抽象化與模塊化,它是以過程為中心構(gòu)造或處理客觀世界問題的。
2)層次邏輯關(guān)系不同。面向?qū)ο蠓椒▌t是用計算機邏輯來模擬客觀世界中的物理存在,以對象的集合類作為處理問題的基本單位,盡可能地使計算機世界向客觀世界靠攏,以使問題的處理更清晰直接,面向?qū)ο蠓椒ㄊ怯妙惖膶哟谓Y(jié)構(gòu)來體現(xiàn)類之間的繼承和發(fā)展。面向過程方法處理問題的基本單位是能清晰準(zhǔn)確地表達過程的模塊,用模塊的層次結(jié)構(gòu)概括模塊或模塊間的關(guān)系與功能,把客觀世界的問題抽象成計算機可以處理的過程。
3)數(shù)據(jù)處理方式與控制程序方式不同。面向?qū)ο蠓椒▽?shù)據(jù)與對應(yīng)的代碼封裝成一個整體,原則上其他對象不能直接修改其數(shù)據(jù),即對象的修改只能由自身的成員函數(shù)完成,控制程序方式上是通過“事件驅(qū)動”來激活和運行程序。而面向過程方法是直接通過程序來處理數(shù)據(jù),處理完畢后即可顯示處理結(jié)果,在控制程序方式上是按照設(shè)計調(diào)用或返回程序,不能自由導(dǎo)航,各模塊之間存在著控制與被控制、調(diào)用與被調(diào)用。
4)分析設(shè)計與編碼轉(zhuǎn)換方式不同。面向?qū)ο蠓椒ㄘ灤┸浖芷诘姆治?、設(shè)計及編碼之間是一種平滑過程,從分析到設(shè)計再到編碼是采用一致性的模型表示,即實現(xiàn)的是一種無縫連接。而面向過程方法強調(diào)分析、設(shè)計及編碼之間按規(guī)則進行轉(zhuǎn)換,貫穿軟件生命周期的分析、設(shè)計及編碼之間,實現(xiàn)的是一種有縫的連接。
二、面向?qū)ο笥惺裁刺卣鳎?/strong>
面向?qū)ο蟮闹饕卣饔谐橄?、繼承、封裝和多態(tài)。
1)抽象。抽象就是忽略一個主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細(xì)節(jié)。抽象包括兩個方面,一是過程抽象,二是數(shù)據(jù)抽象。
2)繼承。繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現(xiàn)有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且子類可以修改或增加新的方法使之更適合特殊的需要。
3)封裝。封裝是指將客觀事物抽象成類,每個類對自身的數(shù)據(jù)和方法實行保護。類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的信息進行隱藏。
4)多態(tài)。多態(tài)是指允許不同類的對象對同一消息做出響應(yīng)。多態(tài)包括參數(shù)化多態(tài)和包含多態(tài)。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好地解決了應(yīng)用程序函數(shù)同名問題。
三、什么是構(gòu)造函數(shù)和析構(gòu)函數(shù)?
1.構(gòu)造函數(shù)
在PHP5之前的版本,構(gòu)造函數(shù)的名字必須與類的名字相同,而從PHP5開始,開發(fā)者可以定義一個名為__construct的方法作為構(gòu)造函數(shù)。構(gòu)造函數(shù)的作用就是當(dāng)類被實例化的時候會被自動調(diào)用,因此構(gòu)造函數(shù)主要用于做一些初始化的工作。使用__construct作為構(gòu)造函數(shù)名字的一個好處是,當(dāng)類名修改的時候,不需要修改構(gòu)造函數(shù)的名字。它的聲明形式為
void __construct ([ mixed $args [, $... ]] )
在C++語言中,子類的構(gòu)造函數(shù)會隱式地調(diào)用父類的無參數(shù)的構(gòu)造函數(shù)。但是在PHP中,子類的構(gòu)造函數(shù)不會隱式地去調(diào)用父類的構(gòu)造函數(shù),需要開發(fā)者通過parent::__construct()來顯式地去調(diào)用父類的構(gòu)造函數(shù)。當(dāng)子類沒有定義構(gòu)造函數(shù)的時候,它會繼承父類的構(gòu)造函數(shù),但前提是父類的構(gòu)造函數(shù)不能被定義為private。使用示例如下:
?php
class BaseClass {
function __construct() {
print "Base constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "Sub constructor\n";
}
}
// 會調(diào)用父類構(gòu)造函數(shù)
$obj = new BaseClass();
//調(diào)用子類構(gòu)造函數(shù),子類構(gòu)造函數(shù)會去調(diào)用父類構(gòu)造函數(shù)
$obj = new SubClass();
?>
程序的運行結(jié)果為
Base constructor
Base constructor
Sub constructor
從上面的講解中可以發(fā)現(xiàn),從PHP5開始多了一種構(gòu)造函數(shù)定義的方法。為了實現(xiàn)不同版本PHP代碼的兼容,在PHP5的類中找不到 __construct() 函數(shù)并且也沒有從父類繼承一個的話,那么它就會嘗試尋找舊式的構(gòu)造函數(shù)(與類同名的函數(shù))。這種兼容的方法存在一個風(fēng)險:在PHP5之前的版本中開發(fā)的類中已有一個名為 __construct() 的方法卻被用于其他用途時,PHP5的類會認(rèn)為這是一個構(gòu)造函數(shù),從而當(dāng)類實例化時自動執(zhí)行這個方法。
從 PHP 5.3.3 開始,在命名空間中,與類名同名的方法不再作為構(gòu)造函數(shù)。這一改變不影響不在命名空間中的類。
2.析構(gòu)函數(shù)
析構(gòu)函數(shù)是在PHP5引入的,它的作用與調(diào)用時機和構(gòu)造函數(shù)剛好相反,它在對象被銷毀時自動執(zhí)行。析構(gòu)函數(shù)__destruct()結(jié)構(gòu)形式如下:
function __destruct(){
/* 類的初始化代碼*/
}
需要注意的是,析構(gòu)函數(shù)是由系統(tǒng)自動調(diào)用的,因此,它不需要參數(shù)。
默認(rèn)情況下,系統(tǒng)僅釋放對象屬性所占用的內(nèi)存,并不銷毀在對象內(nèi)部申請的資源(例如,打開文件、創(chuàng)建數(shù)據(jù)庫的連接等),而利用析構(gòu)函數(shù)在使用一個對象之后執(zhí)行代碼來清除這些在對象內(nèi)部申請的資源(關(guān)閉文件、斷開與數(shù)據(jù)庫的連接)。
與構(gòu)造函數(shù)類似,如果想在子類中調(diào)用父類的析構(gòu)函數(shù),那么需要顯式地調(diào)用:parent::__destruct()。如果子類沒有定義析構(gòu)函數(shù),那么它會繼承父類的析構(gòu)函數(shù)。
當(dāng)對象不再被引用時,將調(diào)用析構(gòu)函數(shù)。如果要明確地銷毀一個對象,那么可以給指向?qū)ο蟮淖兞坎环峙淙魏沃?,通常將變量賦值為NULL或者用unset()函數(shù)。示例代碼如下:
?php
class des{
function __destruct(){
echo "對象被銷毀,執(zhí)行析構(gòu)函數(shù)br>";
}
}
$p=new des(); /* 實例化類 */
echo "程序開始br>";
unset($p); /* 銷毀變量$p */
echo "程序結(jié)束";
?>
四、面向?qū)ο蟮淖饔糜蚍秶心膸追N?
在PHP5中,類的屬性或者方法主要有public、protected和private三種類作用域,它們的區(qū)別如下:
1)public(公有類型)表示全局,類內(nèi)部、外部和子類都可以訪問。
默認(rèn)的訪問權(quán)限為public,也就是說,如果一個方法沒有被public、protected或private修飾,那么它默認(rèn)的作用域為public。
2)protected(受保護類型)表示受保護的,只有本類或子類可以訪問。
在子類中,可以通過self::var或self::method訪問,也可以通過parent::method來調(diào)用父類中的方法。
在類的實例化對象中,不能通過$obj->var來訪問protected類型的方法或?qū)傩浴?br />
3)private(私有類型)表示私有的,只有本類內(nèi)部可以使用。
該類型的屬性或方法只能在該類中使用,在該類的實例、子類、子類的實例中都不能調(diào)用私有類型的屬性和方法。
您可能感興趣的文章:- PHP面向?qū)ο蟪绦蛟O(shè)計繼承用法簡單示例
- PHP面向?qū)ο蟪绦蛟O(shè)計(OOP)之方法重寫(override)操作示例
- PHP面向?qū)ο蟪绦蛟O(shè)計之接口的繼承定義與用法詳解
- PHP面向?qū)ο蟪绦蛟O(shè)計之多態(tài)性的應(yīng)用示例