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

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

伊谢尔伦
リリース: 2023-03-12 13:40:02
オリジナル
1405 人が閲覧しました

この記事では主に、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

メソッドをサポートしており、静的変数を直接定義することはできませんが、静的変数は特性メソッド

によって参照できます。

(7) トレイトは属性を定義できますが、クラス内に同じ名前の属性を定義することはできません
trait A {
  public $test1;
}
 
class B {
  use A;
  public $test2;
}
ログイン後にコピー

以上がトレイトを使用して PHP コードの再利用を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート