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 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
用PHP连接Oracle for NT 远程数据库
Oct 09 PHP
php csv操作类代码
Dec 14 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
php curl请求信息和返回信息设置代码实例
Apr 27 PHP
Yii实现Command任务处理的方法详解
Jul 14 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
PHP count_chars()函数讲解
Feb 14 PHP
laravel 解决Validator使用中出现的问题
Oct 25 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 APC的安装与使用详解
2013/06/13 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
jquery 表单取值常用代码
2009/12/22 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
英国现代市场:ARKET
2019/04/10 全球购物
建筑施工员岗位职责
2013/11/26 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
《得道多助,失道寡助》教学反思
2014/04/19 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
诚信贷款承诺书
2014/05/30 职场文书
会计人员演讲稿
2014/09/11 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
详解SQL的窗口函数
2022/04/21 Oracle