PHP での Traits の使用方法のまとめ

伊谢尔伦
リリース: 2023-03-12 13:36:01
オリジナル
1066 人が閲覧しました

PHP は単一の 継承 言語です。PHP 5.4 Traits が登場する前は、PHP クラスは 2 つの基本クラスから同時にプロパティやメソッドを継承できませんでした。 PHP の Trait の結合機能は Go 言語の結合機能と似ていますが、結合する Trait の名前はクラス内で use キーワードを使用して宣言されます。ただし、特定の Trait の宣言には trait キーワードが使用されません。直接インスタンス化されます。具体的な使用方法は以下のコードを参照してください:

<?php
  trait Drive {
    public $carName = &#39;trait&#39;;
    public function driving() {
      echo "driving {$this->carName}\n";
    }
  }
  class Person {
    public function eat() {
      echo "eat\n";
    }
  }
  class Student extends Person {
    use Drive;
    public function study() {
      echo "study\n";
    }
  }
  $student = new Student();
  $student->study();
  $student->eat();
  $student->driving();
ログイン後にコピー

出力結果は以下の通りです:

study
eat
driving trait
ログイン後にコピー

上記の例では、Studentクラスは、personを継承してeatメソッドを持ち、Driveを組み合わせることで、driveメソッドと、属性 carName。

Trait、基底クラス、このクラスに同名のプロパティやメソッドがあった場合、最終的にどちらが保持されるのでしょうか?次のコードでテストしてください:

<?php 
  trait Drive {
    public function hello() {
      echo "hello drive\n";
    }
    public function driving() {
      echo "driving from drive\n";
    }
  }
  class Person {
    public function hello() {
      echo "hello person\n";
    }
    public function driving() {
      echo "driving from person\n";
    }
  }
  class Student extends Person {
    use Drive;
    public function hello() {
      echo "hello student\n";
    }
  }
  $student = new Student();
  $student->hello();
  $student->driving();
ログイン後にコピー

出力結果は次のとおりです:

hello student
driving from drive
ログイン後にコピー

したがって、次のように結論付けることができます: メソッドまたは属性が同じ名前を持つ場合、現在のクラスのメソッドは特性のメソッドをオーバーライドし、特性のメソッドは、基本クラス Methods のメソッドをオーバーライドします。

複数のトレイトを結合する場合は、トレイト名をカンマで区切ります:

use Trait1, Trait2;

複数のトレイトに同じ名前のメソッドまたはプロパティが含まれている場合はどうなりますか?その答えは、結合された複数の特性に同じ名前のプロパティまたはメソッドが含まれている場合、競合を解決するにはそれらを明示的に宣言する必要がある、そうしないと致命的なエラーが発生するということです。

<?php
trait Trait1 {
  public function hello() {
    echo "Trait1::hello\n";
  }
  public function hi() {
    echo "Trait1::hi\n";
  }
}
trait Trait2 {
  public function hello() {
    echo "Trait2::hello\n";
  }
  public function hi() {
    echo "Trait2::hi\n";
  }
}
class Class1 {
  use Trait1, Trait2;
}
ログイン後にコピー

出力結果は次のとおりです:

PHP Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20
ログイン後にコピー

競合を解決するには、代わりにメソッドを使用し、as はメソッドにエイリアスを与えます:

出力結果は次のとおりです:

Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello
ログイン後にコピー

as キーワードには、メソッドの

アクセス制御

を変更するという別の用途があります。

Trait は、抽象メソッド、

static

プロパティ、および Trait と組み合わせることもできます。静的メソッド、テスト コードは次のとおりです:

出力結果は次のとおりです:

Hello
World
get World
Doing something
1
2
ログイン後にコピー

以上がPHP での Traits の使用方法のまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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