《PHP實(shí)例:Laravel中Trait的用法實(shí)例詳解》要點(diǎn):
本文介紹了PHP實(shí)例:Laravel中Trait的用法實(shí)例詳解,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
本文實(shí)例講述了Laravel中Trait的用法.分享給大家供大家參考,具體如下:PHP實(shí)例
看看PHP官方手冊(cè)對(duì)Trait的定義:PHP實(shí)例
自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了代碼復(fù)用的一個(gè)辦法,稱為 traits.PHP實(shí)例
Traits 是一種為類似 PHP 的單繼承語(yǔ)言而準(zhǔn)備的代碼復(fù)用機(jī)制.Trait 為了減少單繼承語(yǔ)言的限制,使開(kāi)發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用辦法集.Traits 和類組合的語(yǔ)義是定義了一種方式來(lái)減少?gòu)?fù)雜性,避免傳統(tǒng)多繼承和混入類(Mixin)相關(guān)的典型問(wèn)題.PHP實(shí)例
Trait 和一個(gè)類相似,但僅僅旨在用細(xì)粒度和一致的方式來(lái)組合功能.Trait 不能通過(guò)它自身來(lái)實(shí)例化.它為傳統(tǒng)繼承增加了水平特性的組合;也就是說(shuō),應(yīng)用類的成員不需要繼承.PHP實(shí)例
官方手冊(cè)也舉了兩個(gè)例子:PHP實(shí)例
Trait用法示例PHP實(shí)例
<?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í)PHP實(shí)例
從基類繼承的成員被 trait 插入的成員所覆蓋.優(yōu)先順序是來(lái)自當(dāng)前類的成員覆蓋了 trait 的辦法,而 trait 則覆蓋了被繼承的辦法.PHP實(shí)例
從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 辦法所覆蓋.其行為 MyHelloWorld 類中定義的辦法一致.優(yōu)先順序是當(dāng)前類中的辦法會(huì)覆蓋 trait 辦法,而 trait 辦法又覆蓋了基類中的辦法.PHP實(shí)例
<?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ì)輸出:PHP實(shí)例
Hello World!
以上內(nèi)容來(lái)自PHP官網(wǎng)手冊(cè).PHP實(shí)例
Trait在Laravel中的使用PHP實(shí)例
Laravel中大量使用Trait特性來(lái)提高代碼的復(fù)用性,本文只是從某個(gè)Laravel項(xiàng)目中舉個(gè)例子.PHP實(shí)例
比如在一個(gè)PageController.php控制器中有個(gè)show辦法:PHP實(shí)例
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中使用命名空間聲明及引入:PHP實(shí)例
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辦法:PHP實(shí)例
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ù)用.PHP實(shí)例
個(gè)人理解:PHP實(shí)例
在一個(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ù)用.PHP實(shí)例
關(guān)于PHP中Trait的使用還可參考前面一篇《PHP中的traits簡(jiǎn)單使用實(shí)例》PHP實(shí)例
本文轉(zhuǎn)自:小談博客 http://www.tantengvip.com/2015/12/laravel-trait/PHP實(shí)例
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進(jìn)階教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php日期與時(shí)間用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》PHP實(shí)例
希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所贊助.PHP實(shí)例
《PHP實(shí)例:Laravel中Trait的用法實(shí)例詳解》是否對(duì)您有啟發(fā),歡迎查看更多與《PHP實(shí)例:Laravel中Trait的用法實(shí)例詳解》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/7346.html