Laravel中Trait的用法實(shí)例詳解
本文實(shí)例講述了Laravel中Trait的用法。分享給大家供大家參考,具體如下:
看看PHP官方手冊(cè)對(duì)Trait的定義:
自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了代碼復(fù)用的一個(gè)方法,稱為 traits。
Traits 是一種為類似 PHP 的單繼承語(yǔ)言而準(zhǔn)備的代碼復(fù)用機(jī)制。Trait 為了減少單繼承語(yǔ)言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用方法集。Traits 和類組合的語(yǔ)義是定義了一種方式來(lái)減少?gòu)?fù)雜性,避免傳統(tǒng)多繼承和混入類(Mixin)相關(guān)的典型問(wèn)題。
Trait 和一個(gè)類相似,但僅僅旨在用細(xì)粒度和一致的方式來(lái)組合功能。Trait 不能通過(guò)它自身來(lái)實(shí)例化。它為傳統(tǒng)繼承增加了水平特性的組合;也就是說(shuō),應(yīng)用類的成員不需要繼承。
官方手冊(cè)也舉了兩個(gè)例子:
Trait用法示例
<?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ } ?>
Trait的優(yōu)先級(jí)
從基類繼承的成員被 trait 插入的成員所覆蓋。優(yōu)先順序是來(lái)自當(dāng)前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。
從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優(yōu)先順序是當(dāng)前類中的方法會(huì)覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
<?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(); ?>
以上例程會(huì)輸出:
Hello World!
以上內(nèi)容來(lái)自PHP官網(wǎng)手冊(cè)。
Trait在Laravel中的使用
Laravel中大量使用Trait特性來(lái)提高代碼的復(fù)用性,本文只是從某個(gè)Laravel項(xiàng)目中舉個(gè)例子。
比如在一個(gè)PageController.php控制器中有個(gè)show方法:
public function show($slug) { $page = PageRepository::find($slug); $this->checkPage($page, $slug); return View::make('pages.show', ['page' => $page]); }
這里PageRepository::find()方法就是使用的一個(gè)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這個(gè)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了,很好的實(shí)現(xiàn)了代碼的復(fù)用。
個(gè)人理解:
在一個(gè)類中使用Trait,就相當(dāng)于這個(gè)類也有了Trait中定義的屬性和方法。Traits的使用場(chǎng)景是如果多個(gè)類都要用到同樣的屬性或者方法,這個(gè)時(shí)候使用Traits可以方便的給類增加這些屬性或方法,而不用每個(gè)類都去繼承一個(gè)類,如果說(shuō)繼承類是豎向擴(kuò)展一個(gè)類,那么Traits是橫向擴(kuò)展一個(gè)類,從而實(shí)現(xiàn)代碼復(fù)用。
關(guān)于PHP中Trait的使用還可參考前面一篇《PHP中的traits簡(jiǎn)單使用實(shí)例》
本文轉(zhuǎn)自:小談博客 http://www.tantengvip.com/2015/12/laravel-trait/
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進(jìn)階教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php日期與時(shí)間用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
tp5(thinkPHP5)框架連接數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了tp5(thinkPHP5)框架連接數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了基于thinkPHP5框架連接數(shù)據(jù)庫(kù)的相關(guān)配置、數(shù)據(jù)讀取、模板渲染等操作技巧,需要的朋友可以參考下2018-12-12基于Codeigniter框架實(shí)現(xiàn)的student信息系統(tǒng)站點(diǎn)動(dòng)態(tài)發(fā)布功能詳解
這篇文章主要介紹了基于Codeigniter框架實(shí)現(xiàn)的student信息系統(tǒng)站點(diǎn)動(dòng)態(tài)發(fā)布功能,詳細(xì)分析了動(dòng)態(tài)站點(diǎn)相關(guān)的數(shù)據(jù)庫(kù)sql語(yǔ)句、MVC各個(gè)模塊功能與實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03PHP實(shí)現(xiàn)中國(guó)公民身份證號(hào)碼有效性驗(yàn)證示例代碼
這篇文章主要介紹了PHP實(shí)現(xiàn)中國(guó)公民身份證號(hào)碼有效性驗(yàn)證示例代碼,可以判斷身份證號(hào)碼的正確性,非常具有實(shí)用價(jià)值2017-05-05PHP的文件操作與算法實(shí)現(xiàn)的面試題示例
這篇文章主要介紹了PHP的文件操作與算法實(shí)現(xiàn)的面試題示例,選擇了一些最具代表性和最基礎(chǔ)的題目進(jìn)行了歸納,需要的朋友可以參考下2015-08-08