Laravel 中Trait 的⽤法实例详解本⽂实例讲述了Laravel 中Trait 的⽤法。分享给⼤家供⼤家参考,具体如下:
看看PHP 官⽅⼿册对Trait 的定义:
⾃ PHP 5.4.0 起,PHP 实现了代码复⽤的⼀个⽅法,称为 traits 。
Traits 是⼀种为类似 PHP 的单继承语⾔⽽准备的代码复⽤机制。Trait 为了减少单继承语⾔的限制,使开发⼈员能够⾃由地在不同层次结构内独⽴的类中复⽤⽅法集。Traits 和类组合的语义是定义了⼀种⽅式来减少复杂性,避免传统多继承和混⼊类(Mixin )相关的典型问题。
Trait 和⼀个类相似,但仅仅旨在⽤细粒度和⼀致的⽅式来组合功能。Trait 不能通过它⾃⾝来实例化。它为传统继承增加了⽔平特性的组合;也就是说,应⽤类的成员不需要继承。
官⽅⼿册也举了两个例⼦:
Trait ⽤法⽰例
Trait 的优先级
从基类继承的成员被 trait 插⼊的成员所覆盖。优先顺序是来⾃当前类的成员覆盖了 trait 的⽅法,⽽ trait 则覆盖了被继承的⽅法。
从基类继承的成员被插⼊的 SayWorld Trait 中的 MyHelloWorld ⽅法所覆盖。其⾏为 MyHelloWorld 类中定义的⽅法⼀致。优先顺序是当前类中的⽅法会覆盖trait ⽅法,⽽ trait ⽅法⼜覆盖了基类中的⽅法。
以上例程会输出:
1234567891011121314<?php trait ezcReflectionReturnInfo {  function getReturnType() { /*1*/ }  function getReturnDescription() { /*2*/ }}class ezcReflectionMethod extends ReflectionMethod {  use ezcReflectionReturnInfo;  /* ... */}class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
>
123456789101112131415161718<?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();
>
php实例代码详解1Hello World!
以上内容来⾃PHP 官⽹⼿册。
Trait 在Laravel 中的使⽤
Laravel 中⼤量使⽤Trait 特性来提⾼代码的复⽤性,本⽂只是从某个Laravel 项⽬中举个例⼦。
⽐如在⼀个PageController.php 控制器中有个show ⽅法:
这⾥PageRepository::find()⽅法就是使⽤的⼀个Trait 的⽅法,在PageRepository.php 中使⽤命名空间声明及引⼊:
其中SlugRepositoryTrait 这个Trait 定义了find ⽅法:
这样就可以在控制中使⽤Trait 了,很好的实现了代码的复⽤。
个⼈理解:
在⼀个类中使⽤Trait ,就相当于这个类也有了Trait 中定义的属性和⽅法。Traits 的使⽤场景是如果多个类都要⽤到同样的属性或者⽅法,这个时候使⽤Traits 可以⽅便的给类增加这些属性或⽅法,⽽不⽤每个类都去继承⼀个类,如果说继承类是竖向扩展⼀个类,那么Traits 是横向扩展⼀个类,从⽽实现代码复⽤。1234567public function show($slug ){  $page = PageRepository::find($slug );  $this ->checkPage($page , $slug );
return View::make('pages.show', ['page' => $page ]);
}
123456789namespace 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⼦
}
12345678910111213141516trait 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 );
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。