PHP抽象類與接口的區別

抽象類是什麼

  • 抽象類是一種特殊的類,使用abstract修飾
  • 抽象類不能被實例化,只能被繼承
  • 抽象方法不能設置使用private 修飾,由於抽象類不能被實例化,私有成員沒有意義。
  • abstract 還能夠修飾方法,稱之爲抽象方法:抽象方法所在的類必須是抽象類,抽象方法不能有方法體
  • 若是子類繼承了抽象類,要麼子類自身是抽象類,要麼實現全部抽象方法
  • 抽象類的目的是規範子類,一般會在比較大型或者規範的項目中才會使用
  • 抽象類中不容許有成員屬性
<?php
// 抽象類 abstract

abstract class Human{

    // 普通方法
    public function show(){}

    // 抽象方法,抽象方法存在的類必須是抽象類
    // 抽象方法不能有方法體
    public abstract function eat();
};

// 抽象類不能被實例化
// new Human();

// 繼承抽象類的要麼爲抽象類,要麼實現抽象類的全部抽象方法。
class Man extends Human{
    // 實現抽象方法 eat
    public function eat(){}
};
// 能夠正常實例化
new Man();

// 抽象子類繼承抽象類
abstract class Woman extends Human{
    public abstract function makeup();
}

abstract class Wo extends demo{
    // 實現抽象方法 eat
    public function eat(){}

    // 實現抽象方法 makeup
    public function makeup(){}
}
 // 只有實現了抽象類和繼承的抽象類的全部全部抽象方法,才能夠實例化
new Wo();
複製代碼

接口是什麼

PHP是單繼承的,爲了解決這個問題,PHP引入了接口。接口是一種特殊的抽象類,而抽象類又是一種特殊的類。php

  • 接口不是類,但與類有相似的結構,目的是爲了約束類。
  • 接口不能實例化,但類能夠實現接口(注意是實現不是繼承)
<?php
interface 接口名{}
class 類名 implements 接口名{}	
複製代碼
  • 接口是用來規範項目體系,提供一些必須的行爲規範

接口成員: 在接口內部定義的成員markdown

  • 接口成員只容許有兩類
    • 接口常量:const
    • public的接口方法(普通方法和靜態方法)
  • 接口的方法爲抽象方法,沒有方法體(不須要abstract 關鍵字,由於接口方法都是抽象方法)
  • 實現接口的類:
    • 能夠訪問接口的常量:接口常量不能被重寫
    • 須要實現全部的接口方法(除非自己是抽象類)
    • 接口方法實現不容許增長控制權限(必須爲 public)
  1. 接口成員:接口中只能定義共有抽象方法和接口常量
<?php
interface Humen{
    // 接口常量
    const NAME = '人';
    // 接口抽象方法
    public function eat();
    public static function show();
}
複製代碼
  1. 接口成員方法必須被實現的子類實現或類爲抽象類,接口常量能夠直接在實現類中使用
// 實現接口:實體類
class Man implements Humen{
    // 必須實現接口裏的全部的抽象方法
    public function eat(){
        // 能夠訪問常量
       echo self::NAME;
    }
    public static function show(){}
}

// 實現接口:抽象類
abstract class Women implements Humen{};
複製代碼
  1. 類實現接口成員時,不容許重寫接口中的常量,不容許增長接口方法的控制權限
class Women implements Humen{
    // 不容許重寫接口常量
    const NAME = '小孩';
    // 不容許使用其餘訪問修飾符,必須使用public
    private function eat();
};
複製代碼

接口繼承: 接口能夠被接口繼承函數

  • 接口繼承接口的目的
    • 實現接口成員的擴展,豐富接口內容,從而實現更好的對實現類的規範
    • 爲了造成完整的接口體系,讓不一樣級別的類實現不一樣級別的接口
  • 接口能夠一次性繼承多個接口
interface A{}
 interface B{}
 
 // 接口繼承
 interface C extends A{}
 // 接口多繼承
 interface D extends A,B{}
複製代碼

總結:ui

  • 接口能夠繼承接口,並且是多繼承
  • 接口是在大型項目中,爲了保證底層的實現而設計的規範,一般是抽象類實現接口,增長必要成員屬性,而後讓實際業務類去繼承抽象類
  • 類在繼承其餘類的時候能夠同時去實現相應的接口,不須要父類和接口有任何關係

接口和抽象的區別

  • 抽象類中能夠有非抽象方法,而接口中只能有抽象方法
  • 一個類能夠實現多個接口,而一個類只能繼承一個抽象方法
  • 接口的使用方式經過 implements實現,而抽象類使用extends 關鍵字繼承。
  • 抽象類中能夠聲明成員變量,而接口中不能聲明成員變量,但能夠聲明常量。
  • 接口沒有構造函數,而抽象類能夠有構造函數
  • 接口中的抽象方法只能使用public來修飾,而構造方法能夠使用public和protected來修飾
  • 抽象類的抽象方法要使用abstract 來修飾,而接口不須要
相關文章
相關標籤/搜索