自 PHP 5.4.0
起,PHP
實現了一種代碼複用的方法,稱爲 Trait
。php
Trait
是爲相似 PHP
的單繼承語言而準備的一種代碼複用機制。Trait
爲了減小單繼承語言的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用 method
。oop
trait
看上去更像是爲了代碼的複用而寫的一個小插件,它相似於include
能夠用use
放在類中間,讓trait
裏面定義的方法做爲class
的一部分 自己不能直接實例化,Trai
t的做用域在引用該Trai
t類的內部是均可見的(public
、private
等等均可以) 能夠理解爲use
關鍵字將Trait
的實現代碼Copy
了一份到引用該Trait
的類中 。<?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ } ?>
從基類繼承的成員會被 trait
插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait
的方法,而 trait
則覆蓋了被繼承的方法。.net
<?php class Base { public function sayHello() { echo 'Hello '; } } trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } } class MyHelloWorld extends Base { use SayWorld; } $o = new MyHelloWorld(); $o->sayHello(); #輸出:Hello, World! ?>
<?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo 'Hello Universe!'; } } $o = new TheWorldIsNotEnough(); $o->sayHello(); #輸出:Hello Universe! ?>
經過逗號分隔,在 use
聲明列出多個 trait
,能夠都插入到一個類中。插件
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World'; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark(); ?>
若是兩個 trait
都插入了一個同名的方法,若是沒有明確解決衝突將會產生一個致命錯誤。code
引用地址:https://www.php.net/traits繼承