国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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/



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 微博| 芷江| 洞头县| 法库县| 九江县| 五原县| 北京市| 武隆县| 新巴尔虎右旗| 方城县| 金塔县| 临猗县| 乌兰浩特市| 吉隆县| 武定县| 德令哈市| 正定县| 漳浦县| 临漳县| 大方县| 临桂县| 临桂县| 泽州县| 周至县| 金湖县| 东乡族自治县| 乌兰县| 上犹县| 紫阳县| 湛江市| 固阳县| 堆龙德庆县| 肇东市| 汉川市| 柯坪县| 梧州市| 土默特左旗| 沅陵县| 益阳市| 额济纳旗| 名山县|