特性の使用法

WBOY
リリース: 2016-07-29 09:15:16
オリジナル
1459 人が閲覧しました
出典: http://blog.csdn.net/longlongmylove/article/details/7521379
php5.4 の新機能 Traits の紹介1. Traits は 5.4 メソッドで新しく追加されたものです。コードの再利用を実装するため。
php は単一の継承言語ですが、Java のようなコードの再利用を実現するために 1 つのクラスで複数の基本クラスを拡張することはできません。これにより、開発者は複数の基本クラスを異なるクラスで使用できるようになります。クラス。 トレイトとクラスは、コードの複雑さを軽減し、多重継承の問題を回避するために意味的に定義されています。
トレイトはクラスに似ていますが、統一されたきめ細かい方法で一連の関数を提供するためにのみ使用されます。トレイト内でインスタンス化することはできません。つまり、クラスのようなコンストラクター __construct() はありません。トレイトは PHP の従来の継承の拡張機能として機能し、水平統合を実装するため、アプリケーション クラスでは継承が必要なくなります。 1) 使用方法 クラス内の Traits を参照するには、キーワード「use」を使用します。複数の特性は「,」で区切られます。
コード例は次のとおりです:

[php] ビュー 普通のコピー

  1. trait ezcReflectionReturnInfo {
  2. function getReturnType() {
  3. }
  4. 関数 getReturnDescription() {
  5. }
  6. }class ezcReflectionMethod extends ReflectionMethod {
  7. use ReflectionReturnInfo;
  8. /* ... */
  9. ) 情報
  10. /* ... */ }
  11. ?> [php] ビュー 普通のコピー
    1. class Base {
    2. public function sayHello () {
    3. echo 'こんにちは';  
    4. }
    5. }
    6. trait SayWorld {
    7. public 関数 sayHello() {
    8. parent::sayHello() ;  
    9. echo 「World!n」;  
    10. }
    11. }
    12. クラス MyHelloWorld 拡張します Base {
    13. use SayWorld;  
    14. }
    15. class MyHelloWorldExt extends Base {
    16. Use SayWorld;  
    17. public function sayHello() {
    18. /**
    19. * 5.4 での新しい変更点は次のとおりです。5.4 より前のバージョンでは次のメッセージが表示されます:
    20. * PHP Cantal エラー: 文字列オフセットを配列として使用しないでください
    21. 文字を返すように改善しました。文字列内のインデックス番号の
    22. */
    23. $str = 「アーヴィン」 ;  
    24. echo $str[0][0];// echo 'A';
    25. }
    26. 公開 functionshortArray() {
    27. $array = ['first', 2, 3, 4];//5 .4中の数组简单语法
    28. echo $array[0];//5.4中の数解解引用数组元素メソッド
    29. }
    30. }
    31. $o = new MyHelloWorld();  
    32. $o->sayHello();  
    33. $oe = new MyHelloWorldExt();  
    34. $oe->sayHello();  
    35. エコー 「ん」;  
    36. $oe->shortArray();  

    [php] ビュー 普通のコピー

    1. 出:
    2. Hello World!  
    3. A
    4. 最初
    3) 複数のトレイトクラスの宣言には複数のトレイトを追加できます。複数のトレイトは「,」で区切られます。

    [php] ビュー 普通のコピー

    1. trait Hello {
    2. public functionsayHello() {
    3. } }
    4. trait World {
    5. function
    6. sayWorld() {
    7. エコー 「世界」;
    8. use Hello, World }
    9. $o =
    10. new MyHelloWorld() ;
    11. $o - >sayHello();
    12. $o ->sayWorld();
    13. 出力結果:
    14. rreee
    15. 4)複数の特性が競合 2 つの場合同じクラスに追加されたトレイトは同じ関数名を持つため、明示的に処理しないとエラーが発生します。 Tratis 内の同じクラス内の同じ名前を持つ 2 つの関数間の競合を解決するには、 replaceof 演算子を使用して正しい関数を選択する必要があります。
    16. メソッドの一意性と排他性により、内部競合を解決するために競合する関数の後に「as」演算子を使用することが許可されています。
    17. [php] ビュー 普通のコピー
      1. trait A {
      2. public function smallTalk() {
      3. エコー 'a';  
      4. }
      5. public function bigTalk() {
      6. echo 「あ」;  
      7. }
      8. }
      9. 特性B {
      10. 公開 関数 smallTalk() {
      11. echo 'b';  
      12. }
      13. public function bigTalk() {
      14. echo 'B';  
      15. }
      16. }
      17. クラス トーカー {
      18. Aの代わりに A, B {
      19. B::smallTalk を使用します。  
      20. A::B の代わりに bigTalk;  
      21. }
      22. }
      23. class Aliased_Talker {
      24. A の代わりに A, B {
      25. B::smallTalk を使用します。  
      26. A::B の代わりに bigTalk;  
      27. B::bigTalk as トーク;  
      28. }
      29. }
      30. ?>  

      上の例では、Talker はトレイト A と B を使用するため、両方に同じ関数名が存在します。alker では、smallTalk はトレイト B から取得され、bigTalk はトレイト A から取得されます。
      5) 関数のアクセス制限を変更します。Traits 内の関数のアクセス制限プロパティを変更するために使用できます。


      [php] view 普通のコピー

        trait HelloWorld {
      1. public
      2. function sayHello() {
      3. エコー
      4. 「Hello World!」 ';  }
      5. }
      6. // sayHelloの表示設定を変更し、sayHelloの認証制限を変更します。
      7. クラス
      8. MyClass1 {
      9. 使用
      10. HelloWorld { sayHello
      11. 保護として使用します。 } }
      12. // 可視性が変更されたエイリアスメソッド
      13. // sayH Hello の可視性は変更されていません。myPrivateHello を設定します。
      14. class
      15. MyClass2 {
      16. use
      17. HelloWorld { sayHello
      18. as private myPrivateHello; } }
      19. ?>  
      20. 6) 特性は新しい特性を形成します
        多くのクラスと同様に、特性はクラスで使用でき、特性は特性で使用できます。 1 つのトレイトには 1 つ以上のトレイトを定義でき、これらのトレイトは他のトレイトの一部またはすべてのメンバーとして定義できます。

        [php] ビュー 普通のコピー

        1. trait Hello {
        2. public functionsayHello() {
        3. エコー 「こんにちは」 ;
        4. ) function
        5. sayWorld() {
        6. echo
        7. 'World!'
        8. ;
        9. こんにちは、世界}
        10. classMyHelloWorld { use
        11. HelloWorld; $o
        12. =
        13. 新しい
        14. MyHelloWorld ();
        15. $o
        16. ->sayHello();
        17. $o->sayWorld(); 上記のルーチンは次のように出力します。 [php]ビュー 普通のコピー
        18. Hello World!
        19. 7) 抽象特性メンバー クラス内で特定のメソッドを強制するために、特性で抽象メソッドを使用できます。 例:
        20. [php] ビュー 普通のコピー
          1. trait Hello {
          2. public function sayHelloWorld() {
          3. エコー 「こんにちは 」$this->getWorld();  
          4. }
          5. abstract public function getWorld();  
          6. }
          7. クラス MyHelloWorld {
          8. プライベート $ワールド;  
          9. 使用 こんにちは。  
          10. public function __construct($world) {
          11. $this ->世界 = $世界;  
          12. }
          13. public function getWorld() {
          14. 戻る $this->世界;  
          15. }
          16. }
          17. /**
          18. * ここでは5.4の新機能、クラスインスタンス解決参照操作を使用しています
          19. * (new class())->method();
          20. */
          21. (新しい MyHelloWorld('アーヴィン') )->sayHelloWorld();  
          22. ?>  
          23. 该实例出力:
          24. こんにちは、Arvin
          8) 静态裏切り员静的静的変化量は Traits では定義できませんが、Tratis の関数内で定義できます。 Tratis では同様に静的関数を定義できます。

          [php] view 普通のコピー

          1. trait Counter {
          2. public function inc() {
          3. static $c = 0;//静态变量
          4. $c += 1;
          5. echo "$c\n";
          6. }
          7. /**
          8. * 静态方法
          9. */
          10. public static function doSomething() {
          11. echo 'Doing something';
          12. }
          13. }
          14. class C1 {
          15. use Counter;
          16. }
          17. (new C1())->inc(); // echo 1  
          18. C1::doSomething();  
          19. ?>  
          20. 输出为:  
          21. 1  
          22. Doing something  
          9) Traits 定义属性如果在一个trait中定义了一个属性,则在引用该trait的类中不能定义同名的属性,如果该类中定义有和trait中已定义属性具有相同的名字和访问可见性,则是一个E_STRICT 提示,否则抛出语法错误。
          <?php
          trait PropertiesTrait {
              public $x = 1;
          	public $y = 2;
          }
          
          class PropertiesExample {
              use PropertiesTrait;
          	public $x = 1;
          	//public $y = 3;
          }
          
          $example = new PropertiesExample;
          echo $example->x, $example->y;
          ?>
          
          输出:
          12
          ログイン後にコピー
           在最后贴上php5.4.0部分新功能changelog:
          Added short array syntax support ([1,2,3]), see UPGRADING guide for full details.
          Added binary numbers format (0b001010).
          Added support for Class::{expr}() syntax.
          Added support for Traits.//本文的主要内容
          Added closure $this support back.
          Added array dereferencing support.//数组解引用支持,上文中有实例
          Added callable typehint.
          Added indirect method call through array. #47160.
          Added DTrace support.//传说DTrace是一个性能分析工具,可以跟踪出函数调用点,返回点等数据
          Added class member access on instantiation (e.g. (new foo)->bar()) support.//类新实例解引用操作,上文中有实例
          ログイン後にコピー
          本文旨在抛砖引玉,希望大家一起继续探究php5.4的新功能。^_^

          以上就介绍了Traits的用法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

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