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 adodb分页实现代码
Mar 19 PHP
php 启动时报错的简单解决方法
Jan 27 PHP
Thinkphp中import的几个用法详细介绍
Jul 02 PHP
访问编码后的中文URL返回404错误的解决方法
Aug 20 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
PHP实现的简单组词算法示例
Apr 10 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
浅谈php://filter的妙用
Mar 05 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 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实现链结人气统计
2006/10/09 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
php下安装配置fckeditor编辑器的方法
2011/03/02 PHP
php网页病毒清除类
2014/12/08 PHP
浅谈js中变量初始化
2015/02/03 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
python 命令行传入参数实现解析
2019/08/30 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
留学自荐信的技巧
2013/10/17 职场文书
电子商务专业学生的学习自我评价
2013/10/27 职场文书
面试后感谢信
2014/02/01 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
《搭石》教学反思
2014/04/07 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
Docker官方工具docker-registry案例演示
2022/04/13 Servers