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 相关文章推荐
php 404错误页面实现代码
Jun 22 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
php连接数据库代码应用分析
May 29 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
php定时计划任务与fsockopen持续进程实例
May 23 PHP
php实现的通用图片处理类
Mar 24 PHP
php文件操作相关类实例
Jun 18 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
May 31 PHP
Yii2处理密码加密及验证的方法
May 12 PHP
php解决约瑟夫环算法实例分析
Sep 30 PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 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 采集心得技巧
2009/05/15 PHP
php时区转换转换函数
2014/01/07 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
php自动加载方式集合
2016/04/04 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
2017/05/12 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
Python实现文件信息进行合并实例代码
2018/01/17 Python
python爬虫 正则表达式解析
2019/09/28 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
驻村工作先进事迹
2014/08/14 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
交通安全主题班会
2015/08/12 职场文书
运动会广播稿300字
2015/08/19 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
试了下Golang实现try catch的方法
2021/07/01 Golang