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

Laravel中Trait的用法實(shí)例詳解

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

本文實(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)文章

最新評(píng)論