この記事では主にPHPでのトレイトの使い方について詳しく説明していますので、興味のある方は参考にしていただければ幸いです。簡単に言うと、 trait キーワードは、クラスが基本クラスの属性とメソッドを統合したいが、他の基本クラスのメソッドも持ちたいという問題を解決するために PHP で使用されます。また、trait キーワードは通常、使用。
<?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 Fatal error: Traitメソッドhelloは適用されていません。 ~/php54/trait_3.php の 20 行目で Class1 の他の特性メソッドとの衝突
競合を解決するには、代わりに と を演算子として使用し、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 と組み合わせることもでき、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(); ?>
出力結果は次のとおりです。
trait
以上がPHP でのトレイトの使用方法についての詳細な図とテキストの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。