PHP 5.4.0 以降、PHP は traits と呼ばれるコード再利用メソッドを実装しています。
Trait は、PHP のような単一継承言語用に用意されたコード再利用メカニズムです。トレイトは、単一継承言語の制限を軽減し、開発者が異なる階層内の独立したクラスでメソッドを自由に再利用できるように設計されています。特性とクラス構成のセマンティクスは、複雑さを軽減し、従来の多重継承や Mixin クラスに関連する典型的な問題を回避する方法を定義します。
Trait はクラスに似ていますが、きめ細かく一貫した方法で機能を組み合わせるようにのみ設計されています。 トレイト自体を通じてインスタンス化することはできません。これにより、従来の継承に水平機能の組み合わせが追加されます。つまり、アプリケーション内の複数のクラス間の継承が必要なくなります。
この記事では主にPHPでのトレイトの使い方を紹介します簡単に言うと、クラスが基本クラスの属性とメソッドを統合したいという問題を解決するためにPHPでトレイトキーワードが使用されます。他のクラスメソッドも必要であり、トレイトは一般的に use と組み合わせて使用されます。
<?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 method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20
Trait2::hello Trait1::hi Trait2::hello Trait1::hi Trait2::hi Trait1::hello
as キーワードには、メソッドの
アクセス制御を変更するという別の用途がありますstaticプロパティ、および static と組み合わせることもできます。メソッド、テストコードは以下の通り: <?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 サイトの他の関連記事を参照してください。