ホームページ >バックエンド開発 >PHPの問題 >PHP は多重継承ですか、それとも単一継承ですか?

PHP は多重継承ですか、それとも単一継承ですか?

王林
王林オリジナル
2021-10-18 17:51:233135ブラウズ

php は単一継承です。 PHP は多重継承をサポートしていませんが、PHP は [interface test1 {public function connect();}interface test2...] などのインターフェイスまたはトレイトを使用して多重継承を実装できます。

PHP は多重継承ですか、それとも単一継承ですか?

#この記事の動作環境: Windows10 システム、php 7、thinkpad t480 コンピューター。


#php は単一継承ですか、それとも多重継承ですか?もしかしたら、あなたは長い間この問題に悩まされてきたかもしれません。まず、PHP は単一継承であり、多重継承をサポートしていません。オブジェクト指向の特徴は、カプセル化、継承、ポリモーフィズムです。ここでの継承とは、キーワード extends を使用して実現できるクラス間の継承関係を指します。ここで継承できるクラスは 1 つだけです。

それでは、PHP は多重継承を実装できるのでしょうか?答えは「はい」です。

php は 2 つの方法で多重継承を実装できます。 1 つはインターフェイス実装を使用する方法です。もう一つの方法は、特性を使用することです。

最初の 1 つ: インターフェイス実装の使用に関しては、原則として 1 つのクラスが複数のインターフェイスを実装でき、次のように複数のインターフェイス クラスを定義できます。

interface test1 {
	public function connect();
}
interface test2 {
	public function contact();
}

1 つのクラスが複数のインターフェイスを実装します。インターフェイス :

class MyClass implements test1,test2 {
	public function connect() {
		echo "test1";
	}
	public function contact() {
		echo "test2";
	}
}

2 番目: 特性実装を使用します。実際には、トレイトは多重継承とはみなされず、多重継承に似た機能と呼ぶべきです。

特性とは何ですか?

回答: クラスとインターフェイスの両方のように見えますが、実際にはどちらでもありません。トレイトはクラスの部分実装とみなされ、1 つ以上の既存の PHP クラスに混合できます。これには 2 つのクラスがあります。関数: クラスが実行できることを示し、モジュール実装を提供します。 Trait は、PHP の単一継承制限に対する柔軟なコード再利用メカニズムを提供するコード再利用テクノロジです。

//基本类
  class basicTest{
    public function test(){
      echo "hello,world\n";
    }
  }

  //traitOne
  trait traitOne{
    public function test(){
      echo "this is trait one";
    }
    public function testOne(){
      echo "one";
    }
  }

  //traitTwo
  trait traitTwo{
    // public function test(){
      // echo "this is trait two!";
    // }

    public function testTwo(){
      echo "Two";
    }
  }

  //继承基本类,并use trait
  class myCode extends basicTest{
    use traitOne,traitTwo;
    public function test(){
      echo "hehaha!!";
    }
  }

  $obj = new myCode();
  $obj->testTwo();

注:

優先順位: 独自のメソッド > トレイト メソッド > 継承されたメソッド (これは次のようになります。)

上記のコードのコメントを開くと、 2 つのトレイトのメソッドの名前が同じであるため、エラーが報告されます。


トレイト内のメソッド名が重複する問題を解決するにはどうすればよいですか?

//使用demo1和demo2的方法,但并不是导入命名空间
//demo1和demo2种都有hello方法
    use Demo1,Demo2{
        //将Demo1的hello方法替换Demo2的hello方法
        Demo1::hello insteadof Demo2;
        //给Demo2的hello方法起别名
        Demo2::hello as Demo2Hello;
    }
//下方调用的时候
return $this->hello(); // 使用demo1的方法
return $this->Demo2Hello();  //使用demo2的方法

推奨学習:

php トレーニング

以上がPHP は多重継承ですか、それとも単一継承ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。