PHPの抽象クラスとインターフェースの違い

不言
リリース: 2023-03-23 08:12:01
オリジナル
1912 人が閲覧しました

phpの抽象クラスとインターフェースの違い

タグ: 抽象クラスインターフェース抽象クラスとインターフェースphp


はじめに: これは面接でよく聞かれる質問であり、古典的な質問でもあります。この記事に記載されている内容の正確性を証明するために、公式の権威ある指示を引用したり、実験を実施したりするよう最善を尽くします。

抽象クラス

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

  • 抽象として定義されたクラスはインスタンス化できません。クラス内の少なくとも 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(

    b=1) と同様、$b がオプションのパラメーター

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

  • 追加:

    1. 抽象クラスはメンバー属性を持つことができます。
    2. 誰かが尋ねました: 抽象メソッドはプライベートとして定義できますか? 答えはノーです。抽象インターフェイスの目的は、継承のためにクラス モデルを抽象化することであるため、プライベートとして定義すると、外部からアクセスできなくなります。設計目的から。エラーは次のように報告されます
    3. abstract class Sutdent extends Human{
          abstract private function study();}
      ログイン後にコピー
致命的なエラー: 抽象関数 Sutdent::study() は D:11index.php の 10 行目でプライベートに宣言できません

    抽象クラスは抽象クラスを継承できます。抽象親クラスの抽象メソッドをオーバーライドすることはできません
  1. 。このような使用法は、抽象クラスの拡張として理解できます。たとえば、

    abstract class  Human{
        abstract function eat();}abstract class Sutdent extends Human{
        abstract function study();
        //abstract function eat(); 若重写抽象父类的抽象方法eat()会报错}
    ログイン後にコピー

    抽象親クラスの抽象メソッドをオーバーライドすると、次のエラーが報告されます

致命的なエラー: 抽象関数 Human::eat() を継承できません (以前は Sutdent で抽象宣言されていました) ) D:11index.php の 11 行目

Interface

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

インターフェース (インターフェース) を使用すると、クラスが実装する必要があるメソッドを指定できますが、特定のメソッドを定義する必要はありません。これらのメソッドの内容。
  • インターフェースは、標準クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。
  • インターフェイスで定義されているすべてのメソッドはパブリックである必要があります。これはインターフェイスの特性であり、Protected と Private ではエラーが報告されます (
  • 致命的なエラー: インターフェイス メソッドのアクセス タイプ
  • )。

    定数: 定数はインターフェースでも定義できます。インターフェイス定数はクラス定数とまったく同じように使用されますが、サブクラスまたはサブインターフェイスによってオーバーライドすることはできません。 (この方法で使用することはお勧めできません。本当に意味が思いつきません。抽象クラスとの混乱を引き起こしやすいです)
  • interface Play  {  
        const LEVEL=10;  
        public function PlayLOL();  
        public function PlayFootball();  }
    ログイン後にコピー

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

追加:

抽象クラスの継承とインターフェイスの実装を同時に行うことができます。拡張は前に記述する必要があり、メソッドを書き直す必要はありません。



複数のインターフェースを実装する場合、インターフェース内のメソッドに同じ名前を付けることはできません。
  • 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();}
    ログイン後にコピー

    インターフェイスの継承
インターフェイスは、別のインターフェイスまたは複数のインターフェイスを継承したり、extends キーワードを使用したり、複数のインターフェイスを ',' で区切ることができますが、別のインターフェイスを実装することはできず、もちろん、抽象クラス (継承抽象クラス エラー:

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

)

interface Play  {   
    public function PlayFootball();  }interface Play1  {   
    public function PlayFootball();  }interface PlayGame extends play,Play1{  
    public function PlayLOL();  }
ログイン後にコピー
概要 私は通常、類似点と相違点をここに書きますが、私はここに類似点と相違点を書きます。それは書きません、ふふ、上で十分詳しく説明されていると思うので。

簡単に要約しましょう: 抽象クラスは通常、エンティティのタイプを定義するために使用されます それは何ですか? これには、属性、抽象メソッド、および非抽象メソッドが含まれます。インターフェイスは、エンティティのタイプが実行できることを定義するために使用されます。一般に、インターフェイスには抽象メソッドのみがあり、定数はほとんど使用されないと考えられています。 関連する推奨事項:

PHP 抽象クラスとインターフェイスの違い

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!