本文執行個體講述了Laravel中Trait的用法。分享給大家供大家參考,具體如下:
看看PHP官方手冊對Trait的定義:
自 PHP 5.4.0 起,PHP 實現了代碼複用的一個方法,稱為 traits。
Traits 是一種為類似 PHP 的單繼承語言而準備的代碼複用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同階層內獨立的類中複用方法集。Traits 和類組合的語義是定義了一種方式來減少複雜性,避免傳統多繼承和混入類(Mixin)相關的典型問題。
Trait 和一個類相似,但僅僅旨在用細粒度和一致的方式來組合功能。Trait 不能通過它自身來執行個體化。它為傳統繼承增加了水平特性的組合;也就是說,應用類的成員不需要繼承。
官方手冊也舉了兩個例子:
Trait用法樣本
<?phptrait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ }}class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */}class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */}?>
Trait的優先順序
從基類繼承的成員被 trait 插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。
從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
<?phpclass 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在Laravel中的使用
Laravel中大量使用Trait特性來提高代碼的複用性,本文只是從某個Laravel項目中舉個例子。
比如在一個PageController.php控制器中有個show方法:
public function show($slug){ $page = PageRepository::find($slug); $this->checkPage($page, $slug); return View::make('pages.show', ['page' => $page]);}
這裡PageRepository::find()方法就是使用的一個Trait的方法,在PageRepository.php中使用命名空間聲明及引入:
namespace GrahamCampbell\BootstrapCMS\Repositories;use GrahamCampbell\Credentials\Repositories\AbstractRepository;use GrahamCampbell\Credentials\Repositories\PaginateRepositoryTrait;use GrahamCampbell\Credentials\Repositories\SlugRepositoryTrait;class PageRepository extends AbstractRepository{ use PaginateRepositoryTrait, SlugRepositoryTrait; // 此處省略800子}
其中SlugRepositoryTrait這個Trait定義了find方法:
trait SlugRepositoryTrait{ /** * Find an existing model by slug. * * @param string $slug * @param string[] $columns * * @return \Illuminate\Database\Eloquent\Model */ public function find($slug, array $columns = ['*']) { $model = $this->model; return $model::where('slug', '=', $slug)->first($columns); }}
這樣就可以在控制中使用Trait了,很好的實現了代碼的複用。
個人理解:
在一個類中使用Trait,就相當於這個類也有了Trait中定義的屬性和方法。Traits的使用情境是如果多個類都要用到同樣的屬性或者方法,這個時候使用Traits可以方便的給類增加這些屬性或方法,而不用每個類都去繼承一個類,如果說繼承類是豎向擴充一個類,那麼Traits是橫向擴充一個類,從而實現代碼複用。
關於PHP中Trait的使用還可參考前面一篇《PHP中的traits簡單使用執行個體》
本文轉自:小談部落格 http://www.tantengvip.com/2015/12/laravel-trait/
更多關於Laravel相關內容感興趣的讀者可查看本站專題:《Laravel架構入門與進階教程》、《php優秀開發架構總結》、《smarty模板入門基礎教程》、《php日期與時間用法總結》、《php物件導向程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧匯總》
希望本文所述對大家基於Laravel架構的PHP程式設計有所協助。