麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > PHP > 正文

Laravel中Trait的用法實例詳解

2024-05-04 23:44:01
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Laravel中Trait的用法,結合實例形式詳細描述了Trait的功能特性及在Laravel的相關使用技巧,需要的朋友可以參考下
 

本文實例講述了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/



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产成人强伦免费视频网站 | 极品xxxx欧美一区二区 | 黄色网络免费看 | 欧洲成人一区 | 欧美精品一区二区三区久久久 | av电影在线网站 | 中文在线观看视频 | 精品一区二区三区免费毛片 | teensexhd| 青青草成人影视 | 偿还电影免费看 | 亚洲一级网站 | chengrenzaixian| 怦然心动50免费完整版 | 精品一区二区三区网站 | 丰满年轻岳中文字幕一区二区 | 久久免费视频精品 | 九九热在线视频观看这里只有精品 | 日本欧美一区二区三区在线观看 | 亚洲国产视频在线 | 久久精品视频在线看99 | 欧美精品日日鲁夜夜添 | 成人免费看毛片 | 精品国产一区二区三区四区在线 | jizzjizzjizz少妇| 一本一道久久久a久久久精品91 | 国产精品探花在线观看 | 午夜激情视频网站 | 国产成人在线综合 | 久草在线视频在线 | 国产亚洲精品综合一区91555 | 91精品国产777在线观看 | 欧美一级视屏 | 黑人一区二区三区四区五区 | 欧美黄 片免费观看 | 毛片在哪看 | 欧美无极品 | 久久99国产精品免费网站 | 久久国产乱子伦精品 | 久久精品超碰 | 麻豆视频国产在线观看 |