Laravel中Trait的用法实例详解


Posted in PHP onMarch 16, 2016

本文实例讲述了Laravel中Trait的用法。分享给大家供大家参考,具体如下:

看看PHP官方手册对Trait的定义:

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。

Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。

官方手册也举了两个例子:

Trait用法示例

<?php
trait 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 方法又覆盖了基类中的方法。

<?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!

以上内容来自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/

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 PHP
PHP5中使用DOM控制XML实现代码
May 07 PHP
php 常用类汇总 推荐收藏
May 13 PHP
php 过滤器实现代码
Aug 09 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
PHP读书笔记整理_结构语句详解
Jul 01 PHP
万能的php分页类
Jul 06 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
Laravel框架路由管理简单示例
May 07 PHP
Yii框架自定义数据库操作组件示例
Nov 11 PHP
Laravel中注册Facades的步骤详解
Mar 16 #PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 #PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 #PHP
PHP 二维数组和三维数组的过滤
Mar 16 #PHP
详解php中反射的应用
Mar 15 #PHP
php实现图片上传并进行替换操作
Mar 15 #PHP
php模板引擎技术简单实现
Mar 15 #PHP
You might like
浅析PHP的静态成员函数效率更高的原因
2014/06/13 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
python基础教程之缩进介绍
2014/08/29 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
python访问系统环境变量的方法
2015/04/29 Python
python占位符输入方式实例
2019/05/27 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
防灾减灾日活动总结
2014/08/26 职场文书
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
浅谈Redis缓冲区机制
2022/06/05 Redis
python playwrigh框架入门安装使用
2022/07/23 Python