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中的cookie
Nov 26 PHP
PHP 文件上传全攻略
Apr 28 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
ThinkPHP中数据操作案例分析
Sep 27 PHP
php+mysql实现无限级分类
Nov 11 PHP
PHP版微信小店接口开发实例
Nov 12 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 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 得到根目录的 __FILE__ 常量
2008/07/23 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
JS将秒换成时分秒实现代码
2013/09/03 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
javascript arguments使用示例
2014/12/16 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
python的debug实用工具 pdb详解
2019/07/12 Python
Python ATM功能实现代码实例
2020/03/19 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
python os.rename实例用法详解
2020/12/06 Python
Pandas之缺失数据的实现
2021/01/06 Python
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
挂牌仪式主持词
2014/03/20 职场文书
助学贷款贫困证明
2014/09/23 职场文书
学校国庆节活动总结
2015/03/23 职场文书
员工安全责任协议书
2016/03/22 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
Python面向对象编程之类的概念
2021/11/01 Python
一文简单了解MySQL前缀索引
2022/04/03 MySQL