PHP面試專欄正式起更,每週1、3、五更新,提供最好最優質的PHP面試內容。
PHP中面向對象常考的知識點有如下7點,我將會從如下幾點進行詳細介紹說明,幫助你更好的應對PHP面試常考的面向對象相關的知識點和考題。
整個面向對象文章的結構涉及的內容模塊有:php
1、面向對象與面向過程有什麼區別?
2、面向對象有什麼特徵?
3、什麼是構造函數和析構函數?
4、面向對象的做用域範圍有哪幾種?
5、PHP 中魔術方法有哪些?
6、什麼是對象克隆?
7、this、self和parent的區別是什麼?
8、抽象類與接口有什麼區別與聯繫?
9、PHP面向對象的常考面試題講解
關於PHP面向對象的內容將會被分爲三篇文章進行講解完整塊內容,第一篇主要講解一到四點內容,第二篇主要講解五到八的內容,第三篇圍繞第九點進行講解。html
如下正文的內容都來自《PHP程序員面試筆試寶典》書籍,若是轉載請保留出處:程序員
面向對象是當今軟件開發方法的主流方法之一,它是把數據及對數據的操做方法放在一塊兒,做爲一個相互依存的總體,即對象。對同類對象抽象出其共性,即類,類中的大多數數據,只能被本類的方法進行處理。類經過一個簡單的外部接口與外界發生關係,對象與對象之間經過消息進行通訊。程序流程由用戶在使用中決定。例如,站在抽象的角度,人類具備身高、體重、年齡、血型等一些特稱,人類會勞動、會直立行走、會吃飯、會用本身的頭腦去創造工具等這些方法,人類僅僅只是一個抽象的概念,它是不存在的實體,可是全部具有人類這個羣體的屬性與方法的對象都稱爲人,這個對象人是實際存在的實體,每一個人都是人這個羣體的一個對象。
而面向過程是一種以事件爲中心的開發方法,就是自頂向下順序執行,逐步求精,其程序結構是按功能劃分爲若干個基本模塊,這些模塊造成一個樹狀結構,各模塊之間的關係也比較簡單,在功能上相對獨立,每一模塊內部通常都是由順序、選擇和循環三種基本結構組成,其模塊化實現的具體方法是使用子程序,而程序流程在寫程序時就已經決定。例如五子棋,面向過程的設計思路就是首先分析問題的步驟:第一步,開始遊戲;第二步,黑子先走;第三步,繪製畫面;第四步,判斷輸贏;第五步,輪到白子;第六步,繪製畫面;第七步,判斷輸贏;第八步,返回步驟二;第九步,輸出最後結果。把上面每一個步驟用分別的函數來實現,就是一個面向過程的開發方法。面試
具體而言,兩者主要有如下幾個方面的不一樣之處。
1)出發點不一樣。面向對象是用符合常規思惟方式來處理客觀世界的問題,強調把問題域的要領直接映射到對象及對象之間的接口上。而面向過程方法則否則,它強調的是過程的抽象化與模塊化,它是以過程爲中心構造或處理客觀世界問題的。
2)層次邏輯關係不一樣。面向對象方法則是用計算機邏輯來模擬客觀世界中的物理存在,以對象的集合類做爲處理問題的基本單位,儘量地使計算機世界向客觀世界靠攏,以使問題的處理更清晰直接,面向對象方法是用類的層次結構來體現類之間的繼承和發展。面向過程方法處理問題的基本單位是能清晰準確地表達過程的模塊,用模塊的層次結構歸納模塊或模塊間的關係與功能,把客觀世界的問題抽象成計算機能夠處理的過程。
3)數據處理方式與控制程序方式不一樣。面向對象方法將數據與對應的代碼封裝成一個總體,原則上其餘對象不能直接修改其數據,即對象的修改只能由自身的成員函數完成,控制程序方式上是經過「事件驅動」來激活和運行程序。而面向過程方法是直接經過程序來處理數據,處理完畢後便可顯示處理結果,在控制程序方式上是按照設計調用或返回程序,不能自由導航,各模塊之間存在着控制與被控制、調用與被調用。
4)分析設計與編碼轉換方式不一樣。面向對象方法貫穿軟件生命週期的分析、設計及編碼之間是一種平滑過程,從分析到設計再到編碼是採用一致性的模型表示,即實現的是一種無縫鏈接。而面向過程方法強調分析、設計及編碼之間按規則進行轉換,貫穿軟件生命週期的分析、設計及編碼之間,實現的是一種有縫的鏈接。數據庫
面向對象的主要特徵有抽象、繼承、封裝和多態。
1)抽象。抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解所有問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
2)繼承。繼承是一種聯結類的層次模型,而且容許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類能夠從現有的類中派生,這個過程稱爲類繼承。新類繼承了原始類的特性,新類稱爲原始類的派生類(子類),而原始類稱爲新類的基類(父類)。派生類能夠從它的基類那裏繼承方法和實例變量,而且子類能夠修改或增長新的方法使之更適合特殊的須要。
3)封裝。封裝是指將客觀事物抽象成類,每一個類對自身的數據和方法實行保護。類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的信息進行隱藏。
4)多態。多態是指容許不一樣類的對象對同一消息作出響應。多態包括參數化多態和包含多態。多態性語言具備靈活、抽象、行爲共享、代碼共享的優點,很好地解決了應用程序函數同名問題。編程
本身整理了一篇「 PHP和MySQL面試中愛考的10道題」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 10」,我發給你。
在PHP5以前的版本,構造函數的名字必須與類的名字相同,而從PHP5開始,開發者能夠定義一個名爲__construct的方法做爲構造函數。構造函數的做用就是當類被實例化的時候會被自動調用,所以構造函數主要用於作一些初始化的工做。使用__construct做爲構造函數名字的一個好處是,當類名修改的時候,不須要修改構造函數的名字。它的聲明形式爲
void __construct ([ mixed $args [, $... ]] )模塊化
在C++語言中,子類的構造函數會隱式地調用父類的無參數的構造函數。可是在PHP中,子類的構造函數不會隱式地去調用父類的構造函數,須要開發者經過parent::__construct()來顯式地去調用父類的構造函數。當子類沒有定義構造函數的時候,它會繼承父類的構造函數,但前提是父類的構造函數不能被定義爲private。使用示例以下:函數
<?php class BaseClass { function __construct() { print "Base constructor\n"; } } class SubClass extends BaseClass { function __construct() { parent::__construct(); print "Sub constructor\n"; } } // 會調用父類構造函數 $obj = new BaseClass(); //調用子類構造函數,子類構造函數會去調用父類構造函數 $obj = new SubClass(); ?>
程序的運行結果爲工具
Base constructor
Base constructor
Sub constructor
從上面的講解中能夠發現,從PHP5開始多了一種構造函數定義的方法。爲了實現不一樣版本PHP代碼的兼容,在PHP5的類中找不到 __construct() 函數而且也沒有從父類繼承一個的話,那麼它就會嘗試尋找舊式的構造函數(與類同名的函數)。這種兼容的方法存在一個風險:在PHP5以前的版本中開發的類中已有一個名爲 __construct() 的方法卻被用於其餘用途時,PHP5的類會認爲這是一個構造函數,從而當類實例化時自動執行這個方法。
從 PHP 5.3.3 開始,在命名空間中,與類名同名的方法再也不做爲構造函數。這一改變不影響不在命名空間中的類。this
析構函數是在PHP5引入的,它的做用與調用時機和構造函數恰好相反,它在對象被銷燬時自動執行。析構函數__destruct()結構形式以下:
function __destruct(){ /* 類的初始化代碼*/ }
須要注意的是,析構函數是由系統自動調用的,所以,它不須要參數。
默認狀況下,系統僅釋放對象屬性所佔用的內存,並不銷燬在對象內部申請的資源(例如,打開文件、建立數據庫的鏈接等),而利用析構函數在使用一個對象以後執行代碼來清除這些在對象內部申請的資源(關閉文件、斷開與數據庫的鏈接)。
與構造函數相似,若是想在子類中調用父類的析構函數,那麼須要顯式地調用:parent::__destruct()。若是子類沒有定義析構函數,那麼它會繼承父類的析構函數。
當對象再也不被引用時,將調用析構函數。若是要明確地銷燬一個對象,那麼能夠給指向對象的變量不分配任何值,一般將變量賦值爲NULL或者用unset()函數。示例代碼以下:
<?php class des{ function __destruct(){ echo "對象被銷燬,執行析構函數<br>"; } } $p=new des(); /* 實例化類 */ echo "程序開始<br>"; unset($p); /* 銷燬變量$p */ echo "程序結束"; ?>
在PHP5中,類的屬性或者方法主要有public、protected和private三種類做用域,它們的區別以下:
1)public(公有類型)表示全局,類內部、外部和子類均可以訪問。
默認的訪問權限爲public,也就是說,若是一個方法沒有被public、protected或private修飾,那麼它默認的做用域爲public。
2)protected(受保護類型)表示受保護的,只有本類或子類能夠訪問。
在子類中,能夠經過self::var或self::method訪問,也能夠經過parent::method來調用父類中的方法。
在類的實例化對象中,不能經過$obj->var來訪問protected類型的方法或屬性。
3)private(私有類型)表示私有的,只有本類內部可使用。
該類型的屬性或方法只能在該類中使用,在該類的實例、子類、子類的實例中都不能調用私有類型的屬性和方法。
預告:PHP面試常考內容之面向對象(2)將於本週三(2019.2-13)更新。
以上內容摘自《PHP程序員面試筆試寶典》書籍,該書已在天貓、京東、噹噹等電商平臺銷售。
更多PHP相關的面試知識、考題能夠關注公衆號獲取:琉憶編程庫
對本文有什麼問題或建議均可以進行留言,將不斷完善追求極致,感謝大家的支持。