首頁 後端開發 php教程 PHP中的 抽象類別 和 介面

PHP中的 抽象類別 和 介面

Dec 02, 2017 pm 01:39 PM
php 抽象 介面

在實際PHP開發中我們會經常性的用到PHP#抽象類別和接口,今天我們就來詳細的講一下 PHP的抽象類別和介面講的都是哪些東西。

一、 抽象類別abstract class

#1 .抽象類別是指在 class 前加了 abstract 關鍵字且有抽象方法(在類別方法 function 關鍵字前加了 abstract 關鍵字)的類別。

2 .抽象類別不能被直接實例化。抽象類別中只定義(或部分實作)子類別所需的方法。子類別可以透過繼承抽象類別並透過實作抽象類別中的所有抽象方法,使抽象類別具體化。

3 .如果子類別需要實例化,前提是它實作了抽象類別中的所有抽象方法。如果子類別沒有全部實作抽象類別中的所有抽象方法,那麼該子類別也是一個抽象類,必須在 class 前面加上 abstract 關鍵字,並且不能被實例化。

抽象類別A

abstract class A  
{  
    /** 抽象类中可以定义变量 */  
    protected $value1 = 0;  
    private $value2 = 1;  
    public $value3 = 2;  
    /** 也可以定义非抽象方法 */  
    public function my_print()  
    {  
        echo "hello,world/n";  
    }  
    /** 
     * 大多数情况下,抽象类至少含有一个抽象方法。抽象方法用abstract关键字声明,其中不能有具体内容。 
     * 可以像声明普通类方法那样声明抽象方法,但是要以分号而不是方法体结束。也就是说抽象方法在抽象类中不能被实现,也就是没有函数体“{some codes}”。 
     */  
    abstract protected function abstract_func1();  
    abstract protected function abstract_func2();  
}  
abstract class B extends A  
{  
    public function abstract_func1()  
    {  
       echo "implement the abstract_func1 in class A/n";  
    }  
    /** 这么写在zend studio 8中会报错*/  
    //abstract protected function abstract_func2();  
}  
class C extends B  
{  
    public function abstract_func2()  
    {  
       echo "implement the abstract_func2 in class A/n";  
    }  
}
登入後複製

4 .如果像下面這樣創建了一個繼承自 A 的子類別 B ,但是不實作抽象方法 abstract_func() :

Class B extends A{};
登入後複製

那麼程式會出現下列錯誤:

Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::abstract_func)
登入後複製

5 .如果 B 實現了抽象方法 abstract_func() ,那麼 B 中 abstract_func() 方法的訪問控制不能比 A 中 abstract_func() 的訪問控制更嚴格,也就是說:

( 1)      如果 A 中 abstract_func() 聲明為 public ,那麼 B 中 abstract_func() 的聲明只能是 public 聲明為 protected ,那麼B 中 abstract_func() 的聲明可以是 public 或 protected,但不能是 private

(3)      如果 A 中為,「嘿嘿( Fatal error : Abstract function A::abstract_func() cannot be declared private )

二、 接口interface1 .抽象類別提供了具體實現的標準,而介面則是純粹的模版。介面只定義功能,而不包含實現的內容。介面用關鍵字interface 來聲明。

2 . interface 是完全抽象的,只能宣告方法,而且只能宣告 public 的方法,不能宣告 private 及 protected 的方法,無法定義方法體,也不能宣告實例變數 。然而, interface 卻可以宣告常數變數 。但將常數變數放在 interface 中違反了其作為介面的作用而存在的宗旨,也混淆了 interface 與類別的不同價值。如果的確需要,可以將其放在對應的 abstract class或 Class 中。

interface iA  
{  
    const AVAR=3;  
    public function iAfunc1();  
    public function iAfunc2();  
}  
echo iA:: AVAR;
登入後複製

3 .任何實作介面的類別都要實作介面中所定義的所有方法

class E implements iA  
{  
    public function iAfunc1(){echo "in iAfunc1";}  
    public function iAfunc2(){echo "in iAfunc2";}  
}
登入後複製

否則該類別必須宣告為 abstract 。

abstract class E implements iA{}
登入後複製

4 .一個類別可以在聲明中使用 implements 關鍵字來實作某個介面。這麼做之後,實作介面的具體過程和繼承一個只包含抽象方法的抽象類別是一樣的。一個類別可以同時繼承一個父類別和實作任意多個介面。 extends 子句應該在 implements 子句之前。 PHP 只支援繼承自一個父類,因此 extends 關鍵字後面只能跟著一個類別名稱。

interface iB  
{  
    public function iBfunc1();  
    public function iBfunc2();  
}  
class D extends A implements iA,iB  
{  
    public function abstract_func1()  
    {  
       echo "implement the abstract_func1 in class A/n";  
    }  
    public function abstract_func2()  
    {  
       echo "implement the abstract_func2 in class A/n";  
    }  
    public function iAfunc1(){echo "in iAfunc1";}  
    public function iAfunc2(){echo "in iAfunc2";}  
    public function iBfunc1(){echo "in iBfunc1";}  
    public function iBfunc2(){echo "in iBfunc2";}  
}  
   
class D extends B implements iA,iB  
{  
    public function abstract_func1()  
    {  
       parent::abstract_func1();  
       echo "override the abstract_func1 in class A/n";  
    }  
    public function abstract_func2()  
    {  
       echo "implement the abstract_func2 in class A/n";  
    }  
    public function iAfunc1(){echo "in iAfunc1";}  
    public function iAfunc2(){echo "in iAfunc2";}  
    public function iBfunc1(){echo "in iBfunc1";}  
    public function iBfunc2(){echo "in iBfunc2";}  
}
登入後複製

5 .介面不可以實作另一個接口,但可以繼承多個

interface iC extends iA,iB{}  
class F implements iC  
{  
    public function iAfunc1(){echo "in iAfunc1";}  
    public function iAfunc2(){echo "in iAfunc2";}  
    public function iBfunc1(){echo "in iBfunc1";}  
    public function iBfunc2(){echo "in iBfunc2";}  
}
登入後複製

三、 抽象類別和介面的異同##1. 相同點:

(1)      兩者都是抽象類別,都無法實例化。

(2)      interface 實作類別及 abstract class 的子類別都必須實現已宣告的抽象方法。

2. 不同點:

(1)      interface 需要實現,要用 implements ,而 abstract class 則需要繼承,而使用 extends 。

(2)      一個類別可以實作多個 interface ,但一個類別只能繼承一個 abstract class 。

(3)      interface 則強調特定功能的實現,而 abstract class 則強調所屬關係。

(4)      儘管 interface 實作類別及 abstract class 的子類別都必須實現對應的抽象方法,但實現的形式不同。 interface 中的每個方法都是抽象方法,都只是宣告的 (declaration, 沒有方法體 ) ,而實作類別必須實作。而 abstract class的子類別可以選擇性地實現。這個選擇有兩點意義: a) abstract class 中並非所有的方法都是抽象的,只有那些冠有abstract 的方法才是抽象的,子類別必須實現。那些沒有 abstract 的方法,在 abstract class 中必須定義方法體;b) abstract class 的子類別在繼承它時,對非抽象方法既可以直接繼承,也可以覆寫;而對抽象方法,可以選擇實現,也可以留給其子類別來實現,但此類必須也聲明為抽象類別。既是抽象類,當然也不能實例化。

(5)      abstract class 是 interface 與 class 的中介。 abstract class 在 interface 及 class 中起到了承上啟下的作用。一方面, abstract class 是抽象的,可以宣告抽象方法,以規範子類別必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類別直接使用或覆寫。另外,它還可以定義自己的實例變量,以供子類別透過繼承來使用。

(6)      介面中的抽象方法前不用也不能加 abstract 關鍵字,預設隱式就是抽象方法,也不能加 final 關鍵字來防止抽象方法的繼承。而抽象類別中抽象方法前則必須加上 abstract 表示顯示宣告為抽象方​​法。

(7)      介面中的抽象方法預設為 public 的,且只能是 public 的,且無法用 private , protected 修飾子修飾。而抽象類別中的抽象方法則可以用 public , protected 來修飾,但不能用 private 。

3. interface 的應用場合

(1)      類別與類別之間需要特定的介面來協調,而不在乎其如何實現。

(2)      作為能夠實現特定功能的識別存在,以及任何可以是哪個介面方法都沒有純粹的標識。

(3)      則需要將一組類別視為單一的類別,而呼叫者只透過介面來與這組類別連結。

(4)      則需要達到特定的多項功能,而這些功能之間可能完全沒有任何關聯。

4. abstract class 的應用場合

一句話,在既需要統一的接口,又需要實例變數或缺省的方法的情況下,就可以使用它。最常見的有:

(1)      定義了一組介面,但又不想強迫每個實作類別必須實作所有的介面。可以用 abstract class 定義一組方法體,甚至可以是空方法體,然後由子類別選擇自己感興趣的方法來覆寫。

(2)      在某些場合下,只靠純粹的介面無法滿足類別與類別之間的協調,以及必要類別中表示狀態的變數來區分不同的關係。 abstract 的中介作用可以很好地滿足這一點。

(3)      規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類別分別實現;而另一些方法卻需要各個子類別根據自己特定的狀態來實現特 定的功能 。

 以上就是PHP中的 抽象類別 和 介面的所有內容了,希望對大家有幫助。

相關推薦:

php抽象類別的實作方法詳解

php抽象類別、介面的差異與選擇實例詳解

php抽象類別特性實例詳解

以上是PHP中的 抽象類別 和 介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles