PHP でのコードの再利用というと、まず継承を思い浮かべるかもしれませんが、この単一継承言語があまりにも多くのサブクラスを派生すると、親クラスへの依存や過剰な結合など、一連の問題が発生します。 , クラスのカプセル化を破棄します。では、コードを再利用するためのより良い方法はあるのでしょうか?
PHP 5.4.0 以降、PHP は traits と呼ばれるコード再利用の別の方法を実装しました。
Traits は、PHP のような単一継承言語用に用意されたコード再利用メカニズムです。トレイトは、単一継承言語の制約を軽減し、開発者が異なる階層内の独立したクラスでメソッド セットを自由に再利用できるように設計されています。特性とクラス構成のセマンティクスは、複雑さを軽減し、従来の多重継承とミックスインに関連する典型的な問題を回避する方法を定義します。
Traits の使い方はとても簡単で、クラス内で use キーワードを使用するだけです。
trait A { public function test() { echo 'trait A::test()'; } }class b { use A; }$b=new b();$b->test();
簡単に言うと、Trait の優先順位は親クラス メソッドよりも高くなりますが、現在のクラス メソッドよりは低くなります。
trait A { public function test() { echo 'trait A::test()'; } public function test1() { echo 'trait A::test1()'; } }class base{ public function test(){ echo 'base::test()'; } public function test1(){ echo 'base::test1()'; } }class b extends base{ use A; public function test(){ echo 'b::test()'; } }$b=new b();$b->test();//b::test()$b->test1();//trait A::test1()
複数のTraitを使用する際、同じメソッド名が存在すると競合が発生します。メソッド名の競合の問題を解決するには、代わりにと as を使用します
代わりに、2 つの同一のメソッド名を使用して特定のメソッドを宣言できます。
trait A { public function test() { echo 'trait A::test()'; } }trait B { public function test() { echo 'trait B::test()'; } }class c{ use A,B{ A::test insteadof B;//使用 insteadof 明确使用哪个方法 B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用 } }$c=new c();$c->test();//trait A::test()$c->testB();//trait B::test()
asキーワードを使用して、トレイトメソッドのアクセス権を変更できます
trait A { public function test() { echo 'trait A::test()'; } private function test1(){ echo 'trait A::test1()'; } }class b{ use A{ test as protected; test1 as public test2;//更改权限时还可以修改名称 } }$b=new b();$b->test();//Fatal error: Call to protected method b::test()$b->test2();//trait A::test1()
trait A { public function test1() { echo 'test1'; } } trait B { public function test2() { echo 'test2'; } } trait C { use A,B; } class D { use C; } $d = new D(); $d->test2(); //test2
トレイトは属性を定義できますが、クラス 同名属性
trait A { public $test1; } class B { use A; public $test; public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B... }
Trait は抽象メソッドと静的メソッドをサポートしますが、静的変数を直接定義することはできませんが、静的変数はトレイト メソッドから参照できます。
trait A { public function test1() { static $a = 0; $a++; echo $a; } abstract public function test2(); //可定义抽象方法 } class B { use A; public function test2() { } } $b = new B(); $b->test1(); //1 $b->test1(); //2
この特性の使用方法は、現在のオブジェクトの実行環境に別のオブジェクトをマウントするという JavaScript の呼び出しにおそらく似ています。もちろん、JavaScript はプロトタイプベースの言語です。両者の間には比較の余地はありません。ただ、使い方がほぼ同じなのでわかりやすいです。
りー以上がPHP における特性再利用メカニズムの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。