欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Laravel中Trait的用法實例詳解

 更新時間:2016年03月16日 10:30:47   作者:小談博客  
這篇文章主要介紹了Laravel中Trait的用法,結(jié)合實例形式詳細(xì)描述了Trait的功能特性及在Laravel的相關(guān)使用技巧,需要的朋友可以參考下

本文實例講述了Laravel中Trait的用法。分享給大家供大家參考,具體如下:

看看PHP官方手冊對Trait的定義:

自 PHP 5.4.0 起,PHP 實現(xiàn)了代碼復(fù)用的一個方法,稱為 traits。

Traits 是一種為類似 PHP 的單繼承語言而準(zhǔn)備的代碼復(fù)用機制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨立的類中復(fù)用方法集。Traits 和類組合的語義是定義了一種方式來減少復(fù)雜性,避免傳統(tǒng)多繼承和混入類(Mixin)相關(guān)的典型問題。

Trait 和一個類相似,但僅僅旨在用細(xì)粒度和一致的方式來組合功能。Trait 不能通過它自身來實例化。它為傳統(tǒng)繼承增加了水平特性的組合;也就是說,應(yīng)用類的成員不需要繼承。

官方手冊也舉了兩個例子:

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)先級

從基類繼承的成員被 trait 插入的成員所覆蓋。優(yōu)先順序是來自當(dāng)前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。

從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優(yōu)先順序是當(dāng)前類中的方法會覆蓋 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();
?>

以上例程會輸出:

Hello World!

以上內(nèi)容來自PHP官網(wǎng)手冊。

Trait在Laravel中的使用

Laravel中大量使用Trait特性來提高代碼的復(fù)用性,本文只是從某個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了,很好的實現(xiàn)了代碼的復(fù)用。

個人理解:

在一個類中使用Trait,就相當(dāng)于這個類也有了Trait中定義的屬性和方法。Traits的使用場景是如果多個類都要用到同樣的屬性或者方法,這個時候使用Traits可以方便的給類增加這些屬性或方法,而不用每個類都去繼承一個類,如果說繼承類是豎向擴展一個類,那么Traits是橫向擴展一個類,從而實現(xiàn)代碼復(fù)用。

關(guān)于PHP中Trait的使用還可參考前面一篇《PHP中的traits簡單使用實例

本文轉(zhuǎn)自:小談博客 http://www.tantengvip.com/2015/12/laravel-trait/

更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進階教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php日期與時間用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家基于Laravel框架的PHP程序設(shè)計有所幫助。

相關(guān)文章

最新評論