traitsの役割と使用

5725 ワード

raitsは、コード再利用を実現するための5.4に追加された方法である.
 
phpは単一の継承言語であり、javaのように1つのclassでextendsの複数のベースクラスでコード再利用を実現することはできません.Traitsはこのコード再利用の問題を解決することができ、開発者が複数の異なるclassでコード再利用を実現することができます.
Traitsとclassは,意味の定義においてコードの複雑さを低減し,多重継承の問題を回避するためである.
 
Traitsはclassと似ていますが、統合された微細な粒度で機能のセットを提供するためにのみ使用され、Traits内部ではインスタンス化できません.すなわち、classのような構造関数が存在しません.construct().Traitsはphpの伝統的な継承の拡張としてレベル統合を実現する.したがって、アプリケーションのclassでは継承を必要としなくてもよい.
 
1)使用方法
クラスではキーワード'use'でTraitsを参照します.複数のTraitsは','で区切られています.
インスタンスコードは次のとおりです.


 
2)優先順位ベースクラスのメンバー関数はTraitsの関数で上書きされ、現在のクラスのメンバー関数はTraitsの関数で上書きされます.
";
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

class MyHelloWorldExt extends Base {
    use SayWorld;
    public function sayHello() {
        /**
         *    5.4      ,5.4        :
         * PHP Fatal error:  Cannot use string offset as an array
         * 5.4                  
         */
        $str  = "Arvin";
        echo $str[0][0];// echo 'A';
    }

    public function shortArray() {
        $array = ['first', 2, 3, 4];//5.4        
        echo $array[0];//5.4              
    }
}

$o = new MyHelloWorld();
$o-?>sayHello();
$oe = new MyHelloWorldExt();
$oe->sayHello();
echo "
"; $oe->shortArray();

 
  :
Hello World!
A
first

 
3)マルチトラクション
複数のTraitsは、1つのclassの宣言に追加できます.複数のTraits間は「,」で区切られています.
sayHello();
$o->sayWorld();

 
出力結果:
Hello World
 
4)マルチトラクション衝突
同じclassに追加された2つのTraitsに同じ関数名があり、明確な処理が行われていない場合は、エラーが発生します.
同じクラスの2つのTratisで同じ名前の関数の競合を解決するには、insteadofオペレータを使用して正しい関数を選択する必要があります.
メソッドの一意性と排他性のため、'as'オペレータは、内部衝突の問題を解決するために衝突関数の後に使用することを可能にします.

 
上記の例では、TalkerはTraits AとBを使用するため、両方の同じ関数名が競合しています.
AlkerではsmallTalkがTraits Bから、bigTalkがTraits Aからと定義されている.
Aliased_Talkerでは、asオペレータを使用してTraits BのbigTalkが別名talkによって実現されることを保証します.
5)関数アクセス権の変更
as構文を使用して、Traits内の関数のアクセス権プロパティを変更できます.

 
6)Traitsは新しいTraitsを構成し、多くのクラスのようにクラスでTraitsを使用することができ、TraitsのようにTraitsを使用することができる.1つまたは複数のTraitsを1つのTraitsで定義できます.これらのTraitsは、一部またはすべてのメンバーとして他のTraitsで定義できます.
sayHello();
$o->sayWorld();

以上のルーチンが出力します:Hello World!
 
7)抽象Traitメンバーはクラス内で何らかのメソッドを強制的に実装するためにTraitsで抽象メソッドを使用することができる.例:
getWorld();
    }
    abstract public function getWorld();
}

class MyHelloWorld {
    private $world;
    use Hello;
    public function __construct($world) {
        $this->world = $world;
    }
    public function getWorld() {
        return $this->world;
    }
}

/**
 *      5.4             
 * (new class())->method();
 */
(new MyHelloWorld('Arvin'))->sayHelloWorld();
?>

     :
Hello Arvin

 
8)静的Traitメンバー
Traitsではstatic静的変数は定義できませんが、Tratisの関数で定義できます.Tratisでも静的関数を定義できます.
";
    }
    /**
     *     
     */
    public static function doSomething() {
        echo 'Doing something';
    }
}

class C1 {
    use Counter;
}

(new C1())-?>inc(); // echo 1
C1::doSomething();
?>
   :
1
Doing something

 
9)Traits定義属性
1つのtraitで属性が定義されている場合、traitを参照するクラスでは同じ名前の属性は定義できません.traitで定義されている属性と同じ名前とアクセスの可視性が定義されている場合は、E_です.STRICTは、そうでなければ文法の間違いを投げ出すことを提示します.
x, $example->y;
?>

  :
12