ホームページ  >  記事  >  バックエンド開発  >  PHPの抽象クラスとインターフェースの違いは何ですか?

PHPの抽象クラスとインターフェースの違いは何ですか?

青灯夜游
青灯夜游転載
2020-07-16 16:36:552497ブラウズ

この記事では、PHP 抽象クラスとインターフェイスの違いを紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHPの抽象クラスとインターフェースの違いは何ですか?

#抽象クラス

正式な説明についてはドキュメントを確認してください。公式の説明は以下のとおりです。 説明の簡略版:

    #abstract として定義されたクラスはインスタンス化できません。クラス内の少なくとも 1 つのメソッドが抽象宣言されている場合は、クラスを抽象宣言する必要があります。
(抽象クラスは抽象メソッドを持つことはできませんが、抽象クラスをインスタンス化することはできません) 抽象として定義されたメソッドはその呼び出しメソッド (パラメーター) を宣言するだけであり、

定義することはできません。特有の機能が実現されます。

例:

abstract class  AbstractClass
 {
     // 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{}
     abstract protected function  getValue ();
     abstract protected function  prefixValue ( $prefix );

     // 普通方法(非抽象方法)
     public function  printOut () {
        print  $this -> getValue () .  "\n" ;
    }
}
    抽象クラスを継承する場合、非抽象サブクラスは親クラス内のすべての抽象メソッドを定義する必要があり、さらに、これらのメソッドのアクセス制御も定義する必要があります。親クラスと同じ(または緩い)一貫性があること。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実装されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。
  • さらに、メソッドの呼び出し方法が一致している必要があります。つまり、必要なパラメータの型と数が一致している必要があります。たとえば、サブクラスがオプションのパラメータ (関数 Eat($a,$b=1) の

    $b はオプションのパラメータ ) を定義しているが、それが次の抽象メソッドの宣言に含まれていない場合、親クラスの場合、2 つのステートメントの間に競合はありません。これは、PHP 5.4 以降のコンストラクターにも当てはまります。 PHP 5.4 より前のコンストラクター宣言は異なる可能性があります。

補足:

1. 抽象クラスはメンバー属性を持つことができます。

2. 誰かが尋ねました: 抽象メソッドはプライベートとして定義できますか? 答えはノーです、なぜなら抽象インターフェイスの目的は継承のためにクラス モデルを抽象化することだからです。これはプライベートとして定義されており、アクセスできません設計目的が満たされていない場合は、エラーが報告されます。

3. 抽象クラスはインターフェイスを実装でき、そのメソッドを実装する必要はありません

abstract class Sutdent extends Human
{
    abstract private function study();
}
Fatal error: Abstract function Sutdent::study() cannot be declared private in ...
4. 抽象クラスは抽象クラスを継承できますが、

継承することはできません抽象親クラスの抽象メソッドを上書きします。このような使用法は、抽象クラスの拡張として理解できます。例:

abstract class  Human
{
    abstract function eat();
}

abstract class Sutdent extends Human
{
    abstract function study();
    //abstract function eat(); 若重写抽象父类的抽象方法eat()会报错 Fatal error: Can't inherit abstract function Human::eat() (previously declared abstract in Sutdent) in ...
}

Interface

1. インターフェイスの定義

    インターフェース (インターフェース) を使用すると、特定のクラスが実装する必要があるメソッドを指定できますが、これらのメソッドの具体的な内容を定義する必要はありません。
  • インターフェースは、標準クラスの定義と同様に、interface キーワードを使用して定義されますが、その中で定義されているメソッドはすべて空です。
  • インターフェイスで定義されているすべてのメソッドはパブリックである必要があります。これはインターフェイスの特性です。保護されたメソッドとプライベートなメソッドはエラーを報告します (
  • 致命的エラー: インターフェイス メソッドのアクセス タイプ )。
  • 定数: 定数はインターフェイスでも定義できます。インターフェイス定数はクラス定数とまったく同じように使用されますが、サブクラスまたはサブインターフェイスによってオーバーライドすることはできません。 (この方法の使用はお勧めしません。まったく意味が思いつきませんし、抽象クラスと混同されやすいです)
interface Play  
{  
    const LEVEL=10;  
    public function PlayLOL();  
    public function PlayFootball();  
}

2. 実装インターフェイスの

インターフェイスを実装するには、

implements 演算子を使用します。非抽象クラスは、インターフェイスで定義されたすべてのメソッドを実装する必要があります。実装しない場合は、致命的なエラーが報告されます。クラスは複数のインターフェイスを実装できます。複数のインターフェイスの名前を区切るにはカンマを使用します。

追加:

    抽象クラスの継承とインターフェイスの実装を同時に行うことができ、extendsを前に記述する必要があります。
  • 抽象クラスはインターフェイスを実装するため、そのクラス内のメソッドを再作成する必要はありません。
  • 複数のインターフェイスを実装する場合、インターフェイス内のメソッドに同じ名前を付けることはできません。
  • インターフェイスは、extends 演算子を使用して継承することもできます。
  • インターフェイスを実装するには、クラスはインターフェイスで定義されているメソッドとまったく同じメソッドを使用する必要があります。そうしないと、致命的なエラーが発生します。
  • #
    interface Play  
    {  
        const LEVEL=10;  
        public function PlayLOL();  
        public function PlayFootball();  
    } 
    
    interface Read  
    {  
        public function ReadNovel();  
    } 
        
    abstract class  Human
    {
        abstract function eat();
    }
    //抽象类可以实现接口后不实现其方法,可以继承一个抽象类的同时实现多个接口注意必须要把extends语句写在implements前面,否则会报错
    abstract class Sutdent extends Human implements Play,Read
    {
        abstract function study();
    }

#3. インターフェイスの継承#インターフェイスは別のインターフェイスまたは複数のインターフェイスを継承でき、extends キーワードを使用して、複数の区切り文字を使用します。 ',' ただし、別のインターフェイスを実装することはできません。また、抽象クラスを継承することもできません (抽象クラスを継承するときのエラー:

致命的エラー: PlayGame は Human を実装できません - これは D のインターフェイスではありません: \11 \index.php on line 10

interface Play  
{   
    public function PlayFootball();  
}
interface PlayNew  
{   
    public function PlayFootballNew();  
}

interface PlayGame extends play,PlayNew
{  
    public function PlayLOL();  
}

違い: 1. インターフェースの継承にimplementsを使用する, 抽象クラスは extends を使用します。

2. インターフェイスでは変数は宣言できませんが、クラス定数は宣言できます。抽象クラスではさまざまな変数を宣言できます。

3. インターフェイスにはコンストラクターはありませんが、抽象クラスは可能です。 はい

4. インターフェイスのメソッドはデフォルトで public であり、抽象クラスのメソッドは public、protected、private

で変更できます。 5. クラスは継承できます。複数のインターフェイスがありますが、継承できるのは抽象クラスのみです

関連する推奨事項: PHP チュートリアル

以上がPHPの抽象クラスとインターフェースの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。