首頁 >後端開發 >php教程 >Traits的用法

Traits的用法

WBOY
WBOY原創
2016-07-29 09:15:161461瀏覽
原文出處:http://blog.csdn.net/longlongmylove/article/details/7521379
php5.4新功能Traits
php5.4新功能Traits。用於實作程式碼重用的方法。
php是一種單一繼承的語言,我們無法像java一樣在一個class中extends多個基底類別來實現程式碼重複使用,現在Traits能解決這個程式碼重用的問題,它能讓開發者在多個不同的class中實作程式碼重用。 Traits和class在語意的定義上都是為了減少程式碼的複雜性,避免多重繼承的問題。 Traits 和class相似,但是僅用於以統一和較細粒度的方式來提供一組功能,在Traits內部無法進行實例化,即不存在類似class的構造函數__construct()。 Traits作為一個php傳統繼承的擴展並實現水平整合;因此,在應用程式的class中可以不再需要繼承。
1)如何使用在類別中用關鍵字'use' 來引用 Traits。多個Traits 用','隔開。 實例程式碼如下:

[php] view plaincopy
  1. trait ezcReflectionReturnInfo {  
  2. turn() }  
  3. function
  4.  getReturnDescription() {   }  
  5. }
  6. class
  7.  ezcReflectionMethod extends Refl. ezcReflectionReturnInfo;  
  8. /* ... */
  9.    }  
  10. class ezcReflectionFunction 
  11. extends
  12.  ReflectionFunction cReflectionReturnInfo;  
  13. /* ... */  }
  14. ?>  
  15.  
  16. 2)優先權基類中的成員函數將被Traits中的函數覆蓋,而當前類別中的成員函數將覆蓋Traits中的函數將覆蓋Traits中的函數將覆蓋Traits中的函數。 [php] view plaincopy
    1.  基礎 {  
    2.            迴音 
    3. '你好'
    4.     }  }  
    5.      
    6.  
    7. 函數
    8.  sayHello() {  
    9. ;  
    10.         迴聲 }  
    11.   
    12.      使用 SayWorld;  
    13.  MyHelloWorldExt 擴充
    14.  基礎 {  
    15.         函數
    16.  sayHello() {    
    17.         $str
    18.   = 
    19. 「阿文」
    20. ;  
    21.         echo /strcom     }  
    22.       公用
    23.  函數 shortArray() {       , 2, 3, 4];
    24. //5. 4中的簡單文法  
    25.         echo 
    26. /$755;   
    27.     }  }
    28.   
    29. $o
    30.  =  ->sayHello();  $oe
    31.  = new MyHelloWorldExt();  $oe->sayHello(); "n"
    32. ;  
    33. $oe
    34. ->shortArray();  
    35. [php] 查看 純文字
    36. 輸出:  世界你好!  A  第一  
    37.  3)多Traits多個Traits可以加到一個class的聲明中,多個Traits之間用","隔開。

      [php] view plaincopy

      1. trait Hello {  
      2.  sayHello() {          echo 
      3. 'H
      4. echo 'Hello ' ;      }  
      5. }  
      6.     public
      7.  function
      8.  sayWorld() {  
      9. 'World'
      10. ;      }  }  
      11.  MyHelloWorld {  
      12.     use Hello, World;   Hello, World;  
      13. }    
      14. $o
      15.  = new
      16. . ->sayHello();  $o ->sayWorld();  
      17. ?>  
      18. 輸出結果:
      19. Hello World<span>4)多Traits<span>如果添加到相同的函數的進行處理,將產生一個錯誤。 </span>為了解決同一個類別中兩個Tratis中的同名函數衝突,需要用insteadof操作符來選擇正確的函數。 <span>因為方法的唯一性和排他性,'as'操作符允許用在衝突函數之後以解決內部衝突的問題。 </span></span></precourier></li> <li>[php] view plaincopy <span></span><ol start="1"> <li><span><span></span></span></li> <li><span>特質A {  </span></li> <li><span><span>public</span><span> </span>迴音<span></span> <span></span>'a'</span></li>;  <li><span><span></span><span>}  </span> <span></span><span></span>public</span></li> <li><span>函數</span></li> bigTalk() {  <li><span><span></span><span>'; </span><span></span><span>}  </span></span></li> <li>}  <span><span></span><span>  </span><span> </span><span>特質B {  </span></span> </li> <li><span>公</span></li> <li> <span>函數</span> </li> allTalk() <li> 'b'<span></span>;  </li> <li><span></span></li>}  <li> <span><span></span><span> public</span><span> </span><span>函數</span></span> bigTalk() {  </li> <li> <span><span></span><span>echo</span><span> }  </span><span></span></span>}  </li> <li> <span></span>  </li> <li><span><span></span>班級<span></span> 演講者{  <span></span><span></span></span></li>使用<li><span> A, B {  <span></span><span> 而不是Talk</span>  <span></span><span></span>}  </span></li> <li> <span>}  </span> </li> <li><span>  </span></li> <li> <span></span>類</li> <li> Aliased_Talker {  <span><span></span> Aliased_Talker {  <span> </span></span> </li> <li><span>B::smallTalk 取代A;  <span></span><span></span>A::bigTalk 而不是B;  </span></li> <li> <span>B::bigTalk </span>as</li> <li> 談話;  <span></span> </li> <li> <span>}  </span>} >  </li> <li><span></span></li>上面的例子中,Talker使用Traits A和B,因此兩者中相同的函數名稱存在衝突。 <li>alker中定義了smallTalk取自Traits B,bigTalk取自Traits A。 <span>Aliased_Talker中透過使用as操作來確保Traits B中的bigTalk透過別名talk來實現。 </span>5)改變函數存取權</li>我們可以使用as語法來Traits中函數的存取權限屬性。 <li><span><span></span>[php] view 純文字 <span></span></span></li> <li> <span><?php   <span></span><span></span> </li> </ol> </li> </ol></divcourier></phelvetica></phelvetica></span>trait HelloWorld {  </span></li> <li> <span>) {  </span> </li> <li><span></span></li>迴聲<li><span> <span></span>'你好世界! '<span></span>;  </span></li> <li> <span></span>}  </li> <li> <span></span>}  </li> <li> <span></span>. </li> </ol>  <phelvetica neue font-size:15px line-height:24px> <br><br><br><br>班級<divcourier new width:936.53125px overflow:auto padding-top:1px line-height:26px margin:18px background-color:rgb> MyClass1 {  <p></p> <p></p> <ol start="1"> <li><span>受保護<span></span>; }  </span></li> <li> <span></span>}  </li> <li>  <span> <span></span><span>// 具有更改可見性的別名方法</span><span>  </span><span></span></span> </li> <li>// sayHello可見性未更改,設定別名myPrivateHello。 <span><span>  </span><span></span><span></span><span>類</span></span> MyClass2 {  </li> <li> <span> </span> </li> <li>private<span></span> myPrivateHello; }  </li> <li><span></span></li>}  <li><span><span></span><span>}  </span></span></li> <li><span>}  <span></span><span></span>? >  </span></li> <li><span><span> </span><phelvetica neue font-size:15px line-height:24px>6)Traits組成新Traits<br>就像許多類別一樣可以在類別中使用Traits,Traits中一樣可以使用Traits。可以在一個Traits中定義一個或多個Traits,這些Traits 可以作為部分或全部成員被定義在其他Traits。 <divcourier new width:936.53125px overflow:auto padding-top:1px line-height:26px margin:18px background-color:rgb><p></p> <p>[php] view plaincopy </p> <ol start="1"> <li><span><span><?php   </span></span></span></li> <li><span>trait Hello {  </span></li> <li>. {  <span><span></span><span></span><span>echo</span><span> </span></span>'Hello '</li> <li> ;  <span><span></span><span></span>}  <span></span><span></span>}  </span> </li> <li><span>  </span></li> <li><span>function</span></li> sayWorld() {  <li><span></span></li> <li><span>echo</span></li> <li><span><span></span>echo<span></span> <span> </span>'World!'<span></span>;  </span></li> <li><span><span>}  </span><span></span><span>}  </span> <span></span></span></li>use<li><span> Hello, World;  </span></li> <li> <span></span>}  </li> <li> <span></span>  </li> <li><span></span></li>class<li><span> MyHelloWorld {  <span></span><span></span> </span></li> <li><span>  </span></li> <li> <span></span>$o</li> <li> = <span><span>new</span> MyHelloWorld( );  <span></span></span> </li> <li><span>$o<span></span>->sayHello();  <span></span>-</span></li> <li>$o? <span></span> </li> <li><span>以上例程會輸出:</span></li> <li><span>[php] view plaincopy <span></span><span></span><span></span>Hello World!  <span></span></span></li> <li><span>7)抽象Trait成員<span>為了在類別中強制實作某些方法,可以在Traits中使用抽象方法。 </span>例如:<span></span></span></li>[php] view plaincopy <li><span><ol start="1"> <li><span><span></span></span></li> <li><span>trait Hello {  </span></li> <li> <span>    <span>public</span> <span></span>        <span>迴音</span><span> </span></span>'你好'</li> <li>。 <span><span>$這個</span><span>->getWorld();  </span><span></span><span></span>    }  <span></span> <span></span>函數</span> </li> getWorld();  <li><span></span></li> <li>}  <span><span></span><span> </span><span></span><span></span>班級<span></span> MyHelloWorld {  <span></span></span> </li> <li>    <span></span>    </li>使用<li><span> 你好;  </span></li> <li> <span><span>    </span>public<span></span></span>    </li>public<li> <span><span> __construct(</span><span>$world</span><span>) {  </span><span></span></span> </li>       <li><span><span></span>    }  <span></span></span></li>    <li>public<span><span> </span><span>函數</span><span> getWorld() {  </span><span></span><span></span>         <span>回</span></span>    }  </li> <li><span><span>}  </span><span></span><span>  </span><span></span></span></li>/**<li> <span></span> </li> <li><span> * 這裡用到了5.4新功能 類實例化解引用操作<span> </span><span></span><span>*/</span><span>  </span></span></li> <li> <span> (<span>新</span><span> MyHelloWorld(</span><span>'Arvin'</span><span>) )->say</span></span>'Arvin'</li> <li>) )->say<span>); >  </span> </li> <li><span>  </span></li> <li><span>此實例作品:  </span></li> <li><span>Hello Arvin  <span>不能定義靜態靜態變量,可以在Tratis的函數中。 Tratis 中同樣可以定義靜態函數。 </span></span></li> <li>[php] view 純文字 <span><span><ol start="1"> <li><span><span><?php </span></span></li><li><span>trait Counter { </span></li><li><span> <span>public</span><span> </span><span>function</span><span> inc() { </span></span></li><li><span> <span>static</span><span> </span><span>$c</span><span> = 0;</span><span>//静态变量</span><span> </span></span></li><li><span> <span>$c</span><span> &#43;= 1; </span></span></li><li><span> <span>echo</span><span> </span><span>"$c\n"</span><span>; </span></span></li><li><span> } </span></li><li><span> <span>/**</span> </span></li><li><span><span> * 静态方法</span> </span></li><li><span><span> */</span><span> </span></span></li><li><span> <span>public</span><span> </span><span>static</span><span> </span><span>function</span><span> doSomething() { </span></span></li><li><span> <span>echo</span><span> </span><span>'Doing something'</span><span>; </span></span></li><li><span> } </span></li><li><span>} </span></li><li><span> </span></li><li><span><span>class</span><span> C1 { </span></span></li><li><span> <span>use</span><span> Counter; </span></span></li><li><span>} </span></li><li><span> </span></li><li><span>(<span>new</span><span> C1())->inc(); </span><span>// echo 1</span><span>  </span></span></li> <li><span>C1::doSomething();  </span></li> <li><span>?>  </span></li> <li><span>输出为:  </span></li> <li><span>1  </span></li> <li><span>Doing something  </span></li> </ol> <phelvetica neue font-size:15px line-height:24px>9) Traits 定义属性<phelvetica neue font-size:15px line-height:24px>如果在一个trait中定义了一个属性,则在引用该trait的类中不能定义同名的属性,如果该类中定义有和trait中已定义属性具有相同的名字和访问可见性,则是一个<span><codeandale mono sans font-size:13px line-height:normal>E_STRICT</codeandale></span> 提示,否则抛出语法错误。<pre name="code" courier pitch monospace font-size: line-height: margin-bottom: padding: background-color: rgb><?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教程有兴趣的朋友有所帮助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn