この記事では主に、PHP でコードの再利用を実装するためのトレイトの使用例を紹介します。この記事では、メソッド
アクセス制御 の変更に使用できるトレイトの簡単な使用法、優先順位の問題、複数のトレイトの競合の問題について説明します。トレイトの使用 トレイトとその他のコンテンツ、それを必要とする友人はそれを参照できますPHP5.4 では、コード再利用メカニズムを実装するためのトレイトが追加されましたが、トレイトはインスタンス化できず、継承する必要はありません。クラス内でキーワード use を使用して導入するだけです。はい、「,」で区切って複数の特性を導入できます。
(1) Trait は使い方が簡単です<?php
trait A {
public $var1 = 'test1';
public function test1() {
echo 'trait A::test1()';
}
}
trait B {
public $var2 = 'test2';
public function test2() {
echo 'trait B::test2()';
}
}
class C {
use A,B;
}
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()
Trait は継承されたメソッドをオーバーライドし、現在のクラスは Trait メソッドをオーバーライドします。
trait A { public $var1 = 'test'; public function test() { echo 'A::test()'; } public function test1() { echo 'A::test1()'; } } class B { public function test() { echo 'B::test()'; } public function test1() { echo 'B::test1()'; } } class C extends B{ use A; public function test() { echo 'c::test()'; } } $c = new C(); $c->test(); //c::test() $c->test1(); //A::test1()
競合が解決されない場合、致命的なエラーが発生します 競合内のどのメソッドを使用するかを明確にするために、代わりに as
演算子を使用できます。競合するメソッドの 1 つの名前を変更します ;
trait A { public function test() { echo 'A::test()'; } } trait B { public function test() { echo 'B::test()'; } } class C { use A,B { B::test insteadof A; B::test as t; } } $c = new C(); $c->test(); //B::test() $c->t(); //B::test() 可以用as另起名
trait HelloWorld { public function sayHello () { echo 'Hello World!' ; } } // 修改 sayHello 的访问控制 class A { use HelloWorld { sayHello as protected; } } // 给方法一个改变了访问控制的别名 // 原版 sayHello 的访问控制则没有发生变化 class B { use HelloWorld { sayHello as private myPrivateHello ; } } $b = new A(); $b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''
(5) Trait は Trait で使用されます
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
(6) Trait は抽象メソッドをサポートします。 static
メソッドをサポートしており、静的変数を直接定義することはできませんが、静的変数は特性メソッド によって参照できます。 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
(7) トレイトは属性を定義できますが、クラス内に同じ名前の属性を定義することはできません
trait A { public $test1; } class B { use A; public $test2; }
以上がトレイトを使用して PHP コードの再利用を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。