この記事は主に PHP での traits の使い方を紹介しています。編集者が非常に優れていると思ったので、参考として共有します。エディターをフォローして見てみましょう
分かりやすく言うと、trait キーワードは、クラスが基本クラスの属性とメソッドを統合したいが、クラスのメソッドも必要であるという問題を解決するために PHP で使用されます。他の基本クラス、トレイトは一般的に使用され、使用されます。
<?php trait Drive { public $carName = 'trait'; 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を組み合わせることで駆動メソッドと属性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
したがって、次のように結論付けることができます: メソッドまたは属性が同じ名前を持つ場合、現在のクラスのメソッドはトレイトのメソッドをオーバーライドし、トレイトのメソッドはオーバーライドされます基本クラスのメソッドをオーバーライドします。
複数のトレイトを結合する場合は、トレイト名をカンマで区切ります:
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 致命的なエラー: Class1 で他の特性メソッドと衝突があるため、特性メソッド hello が適用されていません。 ~/php54/trait_3 .php の 20 行目
競合を解決するには、代わりに演算子と as を使用します。一方、as はメソッドにエイリアスを与えます。具体的な使用方法については、コードを参照してください。
<?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 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; } } class Class2 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; Trait2::hi as hei; Trait1::hello as hehe; } } $Obj1 = new Class1(); $Obj1->hello(); $Obj1->hi(); echo "\n"; $Obj2 = new Class2(); $Obj2->hello(); $Obj2->hi(); $Obj2->hei(); $Obj2->hehe(); ?>
Trait2::hello Trait1::hi Trait2::hello Trait1::hi Trait2::hi Trait1::hello
Trait は、Trait と組み合わせて抽象メソッドをサポートすることもできます。静的プロパティと静的メソッドのテスト コードは次のとおりです。
<?php trait Hello { public function sayHello() { echo "Hello\n"; } } trait World { use Hello; public function sayWorld() { echo "World\n"; } abstract public function getWorld(); public function inc() { static $c = 0; $c = $c + 1; echo "$c\n"; } public static function doSomething() { echo "Doing something\n"; } } class HelloWorld { use World; public function getWorld() { return 'get World'; } } $Obj = new HelloWorld(); $Obj->sayHello(); $Obj->sayWorld(); echo $Obj->getWorld() . "\n"; HelloWorld::doSomething(); $Obj->inc(); $Obj->inc(); ?>
Hello World get World Doing something 1 2
以上がPHPでのトレイトの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。