原文出處: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
-
trait ezcReflectionReturnInfo {
- turn() }
function-
getReturnDescription() { }
-
}
class- ezcReflectionMethod extends Refl. ezcReflectionReturnInfo;
/* ... */-
}
- class ezcReflectionFunction
extends- ReflectionFunction cReflectionReturnInfo;
-
/* ... */ }
- ?>
-
2)優先權基類中的成員函數將被Traits中的函數覆蓋,而當前類別中的成員函數將覆蓋Traits中的函數將覆蓋Traits中的函數將覆蓋Traits中的函數。 [php] view
plaincopy
-
- 類 基礎 {
- 迴音
'你好'-
; } }
-
公-
函數- sayHello() {
- ;
- 迴聲 「 }
- 類 使用 SayWorld;
} - MyHelloWorldExt 擴充
- 基礎 {
- 公 函數
sayHello() { - $str
= -
「阿文」
;
- echo /strcom }
-
公用
- 函數 shortArray() { , 2, 3, 4];
- //5. 4中的簡單文法
-
echo
- /$755;
- } }
-
$o-
= 新 ->sayHello(); $oe
- = new MyHelloWorldExt(); $oe->sayHello(); "n"
;
- $oe
->shortArray(); - [php] 查看
純文字
-
輸出: 世界你好! A 第一
- 3)多Traits多個Traits可以加到一個class的聲明中,多個Traits之間用","隔開。
[php] view
plaincopy
- trait Hello {
- sayHello() { echo
'H- echo 'Hello ' ; }
- }
- public
- function
- sayWorld() {
'World'-
; } }
MyHelloWorld { -
use Hello, World; Hello, World;
- }
-
$o
- = new
- . ->sayHello(); $o ->sayWorld();
- ?>
輸出結果: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> += 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
作者最新文章
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31