首頁  >  文章  >  後端開發  >  php面試之物件導向的相關知識介紹

php面試之物件導向的相關知識介紹

不言
不言轉載
2019-02-13 15:20:076220瀏覽

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

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

相關推薦:《2019年PHP面試題大匯總(收藏)

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

一、物件導向與過程導向有什麼差別?
二、物件導向有什麼特徵?
三、什麼是建構子和析構函式?
四、物件導向的作用域範圍有哪幾種?
五、PHP 中魔術方法有哪些?
六、什麼是物件克隆?
七、this、self和parent的差別是什麼?
八、抽象類別與介面有什麼差別與連結?
九、PHP物件導向的常考面試題講解

關於PHP物件導向的內容將會被分成三篇文章進行解完整區塊內容,第一篇主要講解一到四點內容,第二篇主要講解五到八的內容,第三篇圍繞第九點講解。

以下正文的內容都來自《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 "对象被销毁,执行析构函数<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面試之物件導向的相關知識介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除