ホームページ  >  記事  >  バックエンド開発  >  トレイトを使用して PHP コードの再利用を実現する方法

トレイトを使用して PHP コードの再利用を実現する方法

伊谢尔伦
伊谢尔伦オリジナル
2017-07-03 11:27:381329ブラウズ

この記事では主に、PHP でコードの再利用を実装するためのトレイトの使用例を紹介します。この記事では、メソッド

アクセス制御 の変更に使用できるトレイトの簡単な使用法、優先順位の問題、複数のトレイトの競合の問題について説明します。トレイトの使用 トレイトとその他のコンテンツ、それを必要とする友人はそれを参照できますPHP5.4 では、コード再利用メカニズムを実装するためのトレイトが追加されましたが、トレイトはインスタンス化できず、継承する必要はありません。クラス内でキーワード use を使用して導入するだけです。はい、「,」で区切って複数の特性を導入できます。

(1) Trait は使い方が簡単です

<?php
 
trait A {
  public $var1 = &#39;test1&#39;;
  public function test1() {
    echo &#39;trait A::test1()&#39;;
  }
}
 
trait B {
  public $var2 = &#39;test2&#39;;
  public function test2() {
    echo &#39;trait B::test2()&#39;;
  }
}
 
class C {
  use A,B;
}
 
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()

(2) 優先順位の問題

Trait は継承されたメソッドをオーバーライドし、現在のクラスは Trait メソッドをオーバーライドします。

trait A {
  public $var1 = &#39;test&#39;;
  public function test() {
    echo &#39;A::test()&#39;;
  }
  public function test1() {
    echo &#39;A::test1()&#39;;
  }
}
 
class B {
  public function test() {
    echo &#39;B::test()&#39;;
  }
  public function test1() {
    echo &#39;B::test1()&#39;;
  }
}
class C extends B{
  use A;
  public function test() {
    echo &#39;c::test()&#39;;
  }
}
 
$c = new C();
$c->test(); //c::test()
$c->test1(); //A::test1()

(3) 複数の特性の競合の問題

競合が解決されない場合、致命的なエラーが発生します 競合内のどのメソッドを使用するかを明確にするために、代わりに as
演算子を使用できます。競合するメソッドの 1 つの名前を変更します ;

trait A {
  public function test() {
    echo &#39;A::test()&#39;;
  }
}
 
trait B {
  public function test() {
    echo &#39;B::test()&#39;;
  }
}
 
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另起名

(4) メソッドのアクセス制御の変更に使用できるようにします

trait HelloWorld {
  public function sayHello () {
    echo &#39;Hello World!&#39; ;
  }
}
 
// 修改 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 &#39;&#39;

(5) Trait は Trait で使用されます

trait A {
  public function test1() {
    echo &#39;test1&#39;;
  }
}
 
trait B {
  public function test2() {
    echo &#39;test2&#39;;
  }
}
 
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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。