PHP 5.4.0 以降、PHP は Trait と呼ばれるコード再利用メソッドを実装しています。
Traits は、PHP のような単一継承言語用に用意されたコード再利用メカニズムです。特性 単一継承言語の制限を軽減し、開発者が異なる階層内の独立したクラスでメソッド セットを再利用できるようにするため。特性 クラス構成のセマンティクスは、複雑さを軽減し、従来の多重継承とミックスインに関連する典型的な問題を回避する方法を定義します。
使い方が簡単
<?phptrait Test { public function echoHello() { echo 'Hello Trait'; } }class Base{ public function index() { echo 'index'; } }class One extends Base{ use Test; }class Two extends Base{ use Test; } $one = new One(); $two = new Two();echo $one->echoHello();echo $one->index();echo $two->echoHello();
結果出力 Hello Trait インデックス Hello Trait。
基本クラスから継承されたメンバーは、Trait によって挿入されたメンバーによってオーバーライドされます。優先順位は、現在のクラスのメンバーが特性メソッドをオーバーライドし、特性が継承されたメソッドをオーバーライドすることです。
<?php trait Test{ public function echoHello() { echo 'Hello Trait'; }}class Base { use Test; public function echoHello() { echo 'Hello Base'; }}class One extends Base { use Test; public function echoHello() { echo 'Hello One'; }}class Two extends Base { use Test;}$one = new One();$two = new Two();$base = new Base(); echo $one->echoHello();echo $two->echoHello();echo $base->echoHello(); 结果输出 Hello One Hello Trait Hello Base。 ?>
クラス 1 の例では、基本クラスと特性テストがカバーされており、現在のクラスのメソッドの優先順位がそれらよりも高いことを示しています。
class 2 つの例は基本クラスをカバーしており、特性は継承された基本クラスよりも優先されます。
class 基本例は Trait Test をカバーしており、現在のクラスのメソッドの優先順位が Trait よりも高いことを示しています。
use ステートメントに複数の特性をカンマで区切ってリストすると、それらはすべてクラスに挿入できます。
<?phptrait Test { public function echoHello() { echo 'Hello '; } }trait TestTwo { public function echoWord() { echo 'word !'; } }class One{ use Test,TestTwo; } $one = new One();echo $one->echoHello();echo $one->echoWord();
結果出力は Hello word! です。
2 つのトレイトが同じ名前のメソッドを挿入した場合、競合が明示的に解決されないと致命的なエラーが発生します。
<?phptrait Test { public function echoHello() { echo 'Hello Test'; } public function echoWord() { echo 'word Test'; } }trait TestTwo { public function echoHello() { echo 'Hello TestTwo '; } public function echoWord() { echo 'word TestTwo'; } }class One{ use Test, TestTwo { Test::echoHello as echoTest; Test::echoWord insteadof TestTwo; TestTwo::echoHello insteadof Test; } } $one = new One();echo $one->echoTest();echo $one->echoWord();echo $one->echoHello();
出力結果: Hello Test word Test Hello TestTwo。
エイリアスとして使用します。つまり、Test::echoHello を echoTest として使用し、Trait Test で echoHello を出力します。
他のトレイトを除外するには、演算子の代わりに使用します。つまり、TestTwo の代わりに Test::echoWord を使用します。テスト、Trait TestでEchoWordを使用
メソッドのコントロール権限を変更
<?phptrait Test { public function echoHello() { echo 'Hello'; } public function echoWord() { echo 'word'; } }trait TestTwo { public function echoHello() { echo 'Hello TestTwo '; } public function echoWord() { echo 'word TestTwo'; } }class One{ use Test { echoHello as private; } }class Two{ use Test { echoHello as private echoTwo; } } $one = new One(); $two = new Two();echo $two->echoHello();
結果の出力 こんにちは。
クラス 1 と同様に使用して echoHello をプライベートとして設定すると、クラス 1 を介して echoHello にアクセスできなくなります。
クラス 2 と同じように使用して、最初に名前を変更し、その後、新しい名前付きメソッドをプライベートとして設定します。元のトレイトのメソッドには通常どおりアクセスできます。
属性もクラスと同様にTraitで定義できます。とても便利ですよ!
上記はトレイトの基本的な使い方の一部です。詳細については公式マニュアルを参照してください。注意すべき点がいくつかあります。 ポイント: Trait は、呼び出し元のクラスによって継承された親クラスのメソッドをオーバーライドします。Trait は、Class のように複数の Trait で構成できます。 Final、static、abstract などの演算子の代わりに、および演算子として使用して、トレイト間の競合を解決できます。
関連する推奨事項:
php での特性とそのアプリケーションの詳細な説明 php での特性再利用メカニズムの使用の詳細な説明 PHP での特性の使用の詳細な説明以上がPHP コードの再利用に関する簡単なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。