この記事では主に PHP における Traits の分析を紹介しますが、これは一定の参考値があります。今回は皆さんに共有します。必要な友人は参考にしてください。
PHP 5.4.0 以降、PHP は A を実装しました。トレイトと呼ばれるコード再利用の方法。
Trait とは文字通り「特性」「特性」という意味で、Trait キーワードを使用することで、PHP のクラスに新しい特性を追加できることがわかります。
Trait は、PHP のような単一継承言語向けに用意されたコード再利用の仕組みです。トレイトは、単一継承言語の制限を軽減し、開発者が異なる階層内の独立したクラスでメソッドを自由に再利用できるように設計されています。特性とクラス構成のセマンティクスは、複雑さを軽減し、従来の多重継承や Mixin クラスに関連する典型的な問題を回避する方法を定義します。
Trait はクラスに似ていますが、きめ細かく一貫した方法で機能を組み合わせるようにのみ設計されています。トレイト自体を通じてインスタンス化することはできません。従来の継承に水平機能の組み合わせが追加されています。つまり、アプリケーション内の複数のクラス間の継承が必要ありません。
使用法: クラス内で use キーワードを使用して、結合する Trait 名を宣言します。特定の Trait 宣言では Trait キーワードが使用されます。Trait はインスタンス化できません。
1. 特性の基本
<?php header("Content-type:text/html;charset=utf-8"); trait Test{public function hello1(){ return "Test::hello1()"; } }class demo1{ use Test; }$obj = new demo1();echo $obj->hello1().'<br />';//Test::hello1()
2. 優先順位
<?php class Base { public function sayHello() { echo 'Hello '; } } trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } }class MyHelloWorld extends Base { use SayWorld; }$o = new MyHelloWorld();$o->sayHello();//Hello World!
<?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } }class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo 'Hello Universe!'; } } $o = new TheWorldIsNotEnough(); $o->sayHello();//Hello Universe!
基本クラスから継承されたメンバーは、挿入された SayWorld トレイトの MyHelloWorld メソッドによってオーバーライドされます。その動作は、MyHelloWorld クラスで定義されたメソッドと一致しています。優先順位としては、現在のクラスのメソッドが特性メソッドをオーバーライドし、特性メソッドが基本クラスのメソッドをオーバーライドします。
3. 複数の特性
カンマで区切って use ステートメントに複数の特性をリストすると、それらはすべて 1 つのクラスに挿入できます。
<?php trait Hello { public function sayHello() { echo 'Hello '.'<br />'; } } trait World { public function sayWorld() { echo 'World'.'<br />'; } }class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'.'<br />'; } }$o = new MyHelloWorld();$o->sayHello();//Hello$o->sayWorld();//World$o->sayExclamationMark();//!
4. 競合の解決
2 つのトレイトが同じ名前のメソッドを挿入する場合、競合が明示的に行われていない場合、競合が発生します。解決しました。致命的なエラーです。
同じクラス内の複数の特性の名前の競合を解決するには、insteadof 演算子を使用して、競合するメソッドのどれを使用するかを明示的に指定する必要があります。
<?php trait A{ public function smallTalk(){ echo 'a'; } public function bigTalk(){ echo 'A'; } } trait B{ public function smallTalk(){ echo 'b'; } public function bigTalk(){ echo 'B'; } }class Talker{ use A,B{ B::smallTalk insteadof A; A::bigTalk insteadof B; } }$obj = new Talker();$obj->smallTalk();//b$obj->bigTalk();//A
上記のメソッドでは、他のメソッドを除外することしかできません。as 演算子は、メソッドのエイリアスを導入できます。 as 演算子はメソッドの名前を変更せず、そのメソッドにも影響を与えないことに注意してください。
<?php trait A{ public function smallTalk(){ echo 'a'; } public function bigTalk(){ echo 'A'; } } trait B{ public function smallTalk(){ echo 'b'; } public function bigTalk(){ echo 'B'; } }class Talker{ use A,B{ B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as b_bigTalk; A::smallTalk as a_smallTalk; } }$obj = new Talker();$obj->smallTalk();//b$obj->bigTalk();//A$obj->b_bigTalk();//B$obj->a_smallTalk();//a
5. メソッドのアクセス制御を変更します。
as 構文を使用して調整することもできます。メソッドのアクセス制御。
<?php trait A{ private function smallTalk(){ echo 'a'; } }class Talker{ use A{ smallTalk as public aaa; } }$obj = new Talker();$obj->aaa();//a
6. 特性グループ
クラスが特性を使用できるのと同じように、他の特性も特性を使用できます。特性を定義するときに 1 つ以上の特性を使用すると、他の特性の一部またはすべてのメンバーを組み合わせることができます。
<?php trait Hello{ public function sayHello(){ echo 'Hello '; } } trait World{ public function sayWorld(){ echo 'World !'; } } trait HelloWorld{ use Hello,World; }class Talker{ use HelloWorld; }$obj = new Talker();$obj->sayHello();//Hello$obj->sayWorld();//World !
7. 抽象メンバー
使用されるクラスに必須の要件を課すために、特性は抽象メソッドの使用をサポートします。
<?php trait Hello{ public function sayWorld(){ echo 'Hello '.$this->getWorld(); } abstract public function getWorld(); }class Talker{ private $world; use Hello; public function getWorld(){ return $this->world; } public function setWorld($val){ $this->world = $val; } }$obj = new Talker();$obj->setWorld("Trait !");$obj->sayWorld();//Hello Trait !
8. 特性の静的メンバー
特性は、静的メンバーの静的メソッドによって定義できます。
<?php trait HelloWorld{ public static function sayHelloWorld(){ echo 'Hello World !'; } }class Talker{ use HelloWorld; } Talker::sayHelloWorld();//Hello World !
<?php trait Counter{ public function inc(){ static $c = 0; $c++; echo "$c\n"; } }class C1{ use Counter; }class C2{ use Counter; }$c1 = new C1();$c1->inc();//1$c1_1 = new C1();$c1_1->inc();//2$c2 = new C2();$c2->inc();//1
9. 属性
トレイトでも属性を定義できます。
<?php trait PropertiesTrait { public $x = 1; }class PropertiesExample { use PropertiesTrait; }$example = new PropertiesExample;echo $example->x;//1
Trait 属性を定義した後、クラスは同じ名前の属性を定義できません。定義しないと、致命的なエラーが発生します。例外が 1 つあります。それは、プロパティに互換性がある (同じアクセス可視性、初期デフォルト値) です。 PHP 7.0 より前では、属性に互換性がある場合、E_STRICT リマインダーが表示されていました。
上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項:
以上がPHPにおける特性の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。