この記事では、コードの再利用を実装するためのPHPのトレイトの使用例を主に紹介します。この記事では、トレイトの簡単な使用方法、優先順位の問題、複数のトレイトの競合について説明します。メソッドのアクセス制御を変更したり、Traits で Traits を使用したりするために使用されます。必要な友達はそれを参照できます
コード再利用メカニズムを実装するために PHP5.4 以降にトレイトが追加されます。トレイトはクラスに似ていますが、インスタンス化することはできず、クラスに導入するために use を使用するだけで済みます。特性は「、」で導入できます。
(1)トレイトが使いやすい
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
特性A { パブリック $var1 = 'test1'; パブリック関数 test1() { エコー '特性 A::test1()'; } }
特性B{ パブリック $var2 = 'test2'; パブリック関数 test2() { エコー '特性 B::test2()'; } }
クラスC { A、Bを使用します; }
$c = 新しい C(); echo $c->var1; //test1 $c->test2(); //トレイト B::test2() |
(2)優先課題
Trait は継承されたメソッドをオーバーライドし、現在のクラスは 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 28 |
特性A { パブリック $var1 = 'テスト'; パブリック関数 test() { エコー 'A::test()'; } パブリック関数 test1() { エコー 'A::test1()'; } }
クラスB{ パブリック関数 test() { エコー 'B::test()'; } パブリック関数 test1() { エコー 'B::test1()'; } } クラス C は B を拡張します{ Aを使用します; パブリック関数 test() { エコー 'c::test()'; } }
$c = 新しい C(); $c->test(); //c::test() $c->test1() //A::test1() |
(3) 複数の特性の競合
競合が解決されない場合、致命的なエラーが発生します。
競合でどのメソッドを使用するかを指定するには、代わりに使用します。
as 演算子を使用して、競合するメソッドの名前を変更できます?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
特性A { パブリック関数 test() { エコー 'A::test()'; } }
特性B{ パブリック関数 test() { エコー 'B::test()'; } }
クラスC { A、Bを使用する{ A; の代わりにB::test B::test as ;} }
$c = 新しい C(); $c->test(); //B::test() $c->t(); //B::test() の名前は で変更できます |
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
特性 HelloWorld { パブリック関数sayHello() { 「ハローワールド!」をエコーします ; } }
//sayHello のアクセス制御を変更します クラスA {HelloWorld {sayHello を保護として使用します。 }
//アクセス制御を変更するエイリアスをメソッドに与えます //元のsayHelloのアクセス制御は変更されていません クラスB{ HelloWorld {sayHello をプライベート myPrivateHello として使用します ;}
$b = 新しい A(); $b->sayHello(); //致命的なエラー: コンテキスト '' から保護されたメソッド A::sayHello() を呼び出します
|
?
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
特性A {
パブリック関数 test1() { エコー 'test1'; } }
特性B{ パブリック関数 test2() { エコー 'test2'; } }
特性 C { A、Bを使用します; }
クラスD{ Cを使用します; }
$d = 新しい D(); $d->test2() //テスト2
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
特性A { パブリック関数 test1() { 静的 $a = 0; $a++; $aをエコー; }
抽象パブリック関数 test2(); //定義可能な抽象メソッド }
クラスB{ Aを使用します; パブリック関数 test2() {
} }
$b = 新しい B(); $b->test1(); //1 $b->test1(); //2 |
(7)Traitでは属性を定義できますが、クラス内に同名の属性を定義することはできません
?
1 2 3 4 5 6 7 8 |
特性A { 公開 $test1; }
クラスB{ Aを使用します; 公開 $test2; |