ホームページ  >  記事  >  バックエンド開発  >  PHP における特性再利用メカニズムの使用方法の詳細な説明

PHP における特性再利用メカニズムの使用方法の詳細な説明

黄舟
黄舟オリジナル
2017-09-08 09:37:411474ブラウズ

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();

Priority

簡単に言うと、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競合問題

複数の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 の呼び出しにおそらく似ています。もちろん、JavaScript はプロトタイプベースの言語です。両者の間には比較の余地はありません。ただ、使い方がほぼ同じなのでわかりやすいです。

りー

以上がPHP における特性再利用メカニズムの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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