1. 程式人生 > 實用技巧 >php面試題之面向物件(一)

php面試題之面向物件(一)

本篇文章給大家帶來的內容是關於php面試之面向物件的相關知識介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

PHP中面向物件常考的知識點有以下8點,我將會從以下幾點進行詳細介紹說明,幫助你更好的應對PHP面試常考的面向物件相關的知識點和考題。

相關推薦:【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

整個面向物件文章的結構涉及的內容模組有:

一、面向物件與面向過程有什麼區別?

二、面向物件有什麼特徵?

三、什麼是建構函式和解構函式?

四、面向物件的作用域範圍有哪幾種?

五、PHP 中魔術方法有哪些?

六、什麼是物件克隆?

七、this、self和parent的區別是什麼?

八、抽象類與介面有什麼區別與聯絡?

關於PHP面向物件的內容將會被分為兩篇文章進行講解完整塊內容,第一篇主要講解一到四點內容,第二篇主要講解五到八的內容。

我的學習群點選此處

一、面向物件與面向過程有什麼區別?

面向物件是當今軟體開發方法的主流方法之一,它是把資料及對資料的操作方法放在一起,作為一個相互依存的整體,即物件。對同類物件抽象出其共性,即類,類中的大多數資料,只能被本類的方法進行處理。類通過一個簡單的外部介面與外界發生關係,物件與物件之間通過訊息進行通訊。程式流程由使用者在使用中決定。

例如,站在抽象的角度,人類具有身高、體重、年齡、血型等一些特稱,人類會勞動、會直立行走、會吃飯、會用自己的頭腦去創造工具等這些方法,人類僅僅只是一個抽象的概念,它是不存在的實體,但是所有具備人類這個群體的屬性與方法的物件都稱為人,這個物件人是實際存在的實體,每個人都是人這個群體的一個物件。

而面向過程是一種以事件為中心的開發方法,就是自頂向下順序執行,逐步求精,其程式結構是按功能劃分為若干個基本模組,這些模組形成一個樹狀結構,各模組之間的關係也比較簡單,在功能上相對獨立,每一模組內部一般都是由順序、選擇和迴圈三種基本結構組成,其模組化實現的具體方法是使用子程式,而程式流程在寫程式時就已經決定。

例如五子棋,面向過程的設計思路就是首先分析問題的步驟:第一步,開始遊戲;第二步,黑子先走;第三步,繪製畫面;第四步,判斷輸贏;第五步,輪到白子;第六步,繪製畫面;第七步,判斷輸贏;第八步,返回步驟二;第九步,輸出最後結果。把上面每個步驟用分別的函式來實現,就是一個面向過程的開發方法。

具體而言,二者主要有以下幾個方面的不同之處。

  1. 出發點不同。面向物件是用符合常規思維方式來處理客觀世界的問題,強調把問題域的要領直接對映到物件及物件之間的介面上。而面向過程方法則不然,它強調的是過程的抽象化與模組化,它是以過程為中心構造或處理客觀世界問題的。

  2. 層次邏輯關係不同。面向物件方法則是用計算機邏輯來模擬客觀世界中的物理存在,以物件的集合類作為處理問題的基本單位,儘可能地使計算機世界向客觀世界靠攏,以使問題的處理更清晰直接,面向物件方法是用類的層次結構來體現類之間的繼承和發展。面向過程方法處理問題的基本單位是能清晰準確地表達過程的模組,用模組的層次結構概括模組或模組間的關係與功能,把客觀世界的問題抽象成計算機可以處理的過程。

  3. 資料處理方式與控制程式方式不同。面向物件方法將資料與對應的程式碼封裝成一個整體,原則上其他物件不能直接修改其資料,即物件的修改只能由自身的成員函式完成,控制程式方式上是通過“事件驅動”來啟用和執行程式。而面向過程方法是直接通過程式來處理資料,處理完畢後即可顯示處理結果,在控制程式方式上是按照設計呼叫或返回程式,不能自由導航,各模組之間存在著控制與被控制、呼叫與被呼叫。

  4. 分析設計與編碼轉換方式不同。面向物件方法貫穿軟體生命週期的分析、設計及編碼之間是一種平滑過程,從分析到設計再到編碼是採用一致性的模型表示,即實現的是一種無縫連線。而面向過程方法強調分析、設計及編碼之間按規則進行轉換,貫穿軟體生命週期的分析、設計及編碼之間,實現的是一種有縫的連線。

二、面向物件有什麼特徵?

面向物件的主要特徵有抽象、繼承、封裝和多型。

  1. 抽象。抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。

  2. 繼承。繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且子類可以修改或增加新的方法使之更適合特殊的需要。

  3. 封裝。封裝是指將客觀事物抽象成類,每個類對自身的資料和方法實行保護。類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的資訊進行隱藏。

  4. 多型。多型是指允許不同類的物件對同一訊息做出響應。多型包括引數化多型和包含多型。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好地解決了應用程式函式同名問題。

三、什麼是建構函式和解構函式?

1、建構函式

在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 開始,在名稱空間中,與類名同名的方法不再作為建構函式。這一改變不影響不在名稱空間中的類。

2、解構函式

解構函式是在PHP5引入的,它的作用與呼叫時機和建構函式剛好相反,它在物件被銷燬時自動執行。解構函式__destruct()結構形式如下:

function __destruct(){

    /* 類的初始化程式碼*/

}

需要注意的是,解構函式是由系統自動呼叫的,因此,它不需要引數。

預設情況下,系統僅釋放物件屬性所佔用的記憶體,並不銷燬在物件內部申請的資源(例如,開啟檔案、建立資料庫的連線等),而利用解構函式在使用一個物件之後執行程式碼來清除這些在物件內部申請的資源(關閉檔案、斷開與資料庫的連線)。

與建構函式類似,如果想在子類中呼叫父類的解構函式,那麼需要顯式地呼叫:parent::__destruct()。如果子類沒有定義解構函式,那麼它會繼承父類的解構函式。

當物件不再被引用時,將呼叫解構函式。如果要明確地銷燬一個物件,那麼可以給指向物件的變數不分配任何值,通常將變數賦值為NULL或者用unset()函式。示例程式碼如下:

<?php

    class des{

        function __destruct(){

            echo "物件被銷燬,執行解構函式
";

        }

    }

    $p=new des(); /* 例項化類 */

    echo "程式開始
";

    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方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這裡把它整理成了PDF和文件,如果有需要的可以

點選進入暗號: 部落格園


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,需要的可以加入我的PHP技術交流群953224940