簡単に言うと、trait キーワードは、クラスが基本クラスの プロパティとメソッド を統合したいが、他の基本クラスのメソッドや trait も必要とするという問題を解決するために PHP で使用されます。通常は use とペアになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?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();
?>
|
ログイン後にコピー
出力結果は以下の通りです。
上記の例では、Studentクラスはを介してpersonを継承し、eatメソッドを持ち、Driveを組み合わせることで、駆動メソッドと属性carNameを持ちます。
Trait、基底クラス、このクラスに同名のプロパティやメソッドがあった場合、最終的にどちらが保持されるのでしょうか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?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();
?>
|
ログイン後にコピー
出力結果は次のとおりです:
1 2 | hello student
driving from drive
|
ログイン後にコピー
したがって、メソッドまたは属性が同じ名前を持つ場合、現在のクラスのメソッドがトレイトのメソッドをオーバーライドし、トレイトのメソッドが今度はクラスのメソッドをオーバーライドすると結論付けられます。基本クラス。
複数のトレイトを結合する場合は、トレイト名をカンマで区切ります:
複数のトレイトに同じ名前のメソッドまたはプロパティが含まれている場合はどうなりますか?その答えは、結合された複数の特性に同じ名前のプロパティまたはメソッドが含まれている場合、競合を解決するにはそれらを明示的に宣言する必要がある、そうしないと致命的なエラーが発生するということです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?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;
}
?>
|
ログイン後にコピー
出力結果は次のとおりです:
コードは次のとおりです:
1 | 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
|
ログイン後にコピー
競合を解決するには、代わりにメソッドを使用し、メソッドにエイリアスを与えます。具体的な使用法を参照してください。 コード:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <a href= "https://www.php.cn/wiki/996.html" target= "_blank" ><?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();
?></a>
|
出力結果は次のとおりです:
1 2 3 4 5 6 7 | Trait2::hello
Trait1::hi
Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello
|
ログイン後にコピー
as キーワードには別の用途があり、メソッドの
アクセス制御
を変更することです: Trait を Trait と組み合わせることもできます。 Trait は抽象メソッド、
static
属性、および Static メソッドをサポートしています。テストコードは次のとおりです:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <a href= "https://www.php.cn/wiki/188.html" target= "_blank" ><?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();
?></a>
|
出力結果は次のとおりです:
1 2 3 4 5 6 | Hello
World
get World
Doing something
1
2
|
ログイン後にコピー
以上がPHPにおけるトレイトの基本的な使用例まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。