简单应用:

PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好。其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西。
Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化。先来看下语法:

<?php
trait myTrait{function traitMethod1(){}function traitMethod2(){}}//然后是调用这个traits,语法为:
class myClass{use myTrait;
}//这样就可以通过use myTraits,调用Traits中的方法了,比如:
$obj = new myClass();
$obj-> traitMethod1 ();
$obj-> traitMethod2 ();
>

为什么要用trait

接下来,我们探究下为什么要用traits,举个例子,比如有两个类,分别为business(商务者)和Individual(个人),它们都有地址的属性,传统的做法是,再抽象出一个这两个类都共同有特性的父类,比如client,在client类中设置访问属性address,business和individual分别继承之,如下代码:

// Class Client
class Client { private $address; public getAddress() { return $this->address; }    public setAddress($address) { $this->address = $address;  }
} class Business extends Client{ //这里可以使用address属性
} // Class Individual
class Individual extends Client{
//这里可以使用address属性
} 

但假如又有一个叫order类的,需要访问同样的地址属性,那怎么办呢?order类是没办法继承client类的,因为这个不符合OOP的原则。这个时候traits就派上用场了,可以定义一个traits,用来定义这些公共属性。

// Trait Address
trait Address{private $address;public getAddress() {eturn $this->address;}public setAddress($address) {$this->address = $address;}
}
// Class Business
class Business{use Address;// 这里可以使用address属性
}
// Class Individual
class Individual{use Address;//这里可以使用address属性
}
// Class Order
class Order{use Address;//这里可以使用address属性
}   

Trait的优先级

从基类继承的成员被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

个人理解:

在一个类中使用Trait,就相当于这个类也有了Trait中定义的属性和方法。Traits的使用场景是如果多个类都要用到同样的属性或者方法,这个时候使用Traits可以方便的给类增加这些属性或方法,而不用每个类都去继承一个类,如果说继承类是竖向扩展一个类,那么Traits是横向扩展一个类,从而实现代码复用。

参考文章:
https://laravel-china.org/topics/1294/where-did-laravel-use-trait

trait不能被实例化,但是我们可以使用trait里面已经定义的方法,例如下面:

<?phpnamespace App\Http\Traits;use Carbon\Carbon;trait ModelTrait
{public function getCreatedAtAttribute($value){if (!$value) {return;}$date = Carbon::createFromFormat('Y-m-d H:i:s', $value, 'UTC');$time = $date->setTimezone('Asia/ShangHai')->toDateTimeString();return $time;}public function getUpdatedAtAttribute($value){return $this->getCreatedAtAttribute($value);}public function getAppointmentStartTimeAttribute($value){return $this->getCreatedAtAttribute($value);}}

Laravel Trait相关推荐

  1. Laravel Trait method broker has not been applied, because there are collisions with other trait meth

    在改造Laravel的Auth系统的时候,想把ResetPasswordController和ForgotPasswordController放在自己写的PasswordController里面,然后 ...

  2. Laravel 事件侦听的几个方法 [Trait, Model boot(), Observer Class]

    1 Trait 1.1 可以在 Trait 中定义一个静态的 bootFooBar() 方法,注:FooBar 是你的 Trait 名称 namespace App\Traits; use App\A ...

  3. 分享一个 Trait 来易用 Laravel 的缓存

    求星求关注 https://github.com/deathkel/easy-cache 安装 composer require deathkel/easy-cache 使用 这个包会自动缓存使用了该 ...

  4. php调用trait方法,PHP Laravel中的Trait使用方法

    Trait是一种在单继承语言(如PHP)中重用代码的机制.Trait旨在通过使开发人员能够在生活在不同类层次结构中的多个独立类中自由地重用方法集来减少单继承的某些限制.Traits和类组合的语义以降低 ...

  5. Laravel 5 - Trait method can has not been applied, because there are collisions with other trai

    1.Laravel 5 - Trait method can has not been applied, because there are collisions with other trait m ...

  6. Laravel Lumen之Eloquent ORM使用速查-基础部分

    使用Eloquent ['eləkwənt] 时,数据库查询构造器的方法对模型类也是也用的,使用上只是省略了DB::table('表名')部分. 在模型中使用protected成员变量$table指定 ...

  7. Laravel 中简约而不简单的 Macroable 宏指令

    百度百科的定义: 计算机科学里的宏(Macro),是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是 ...

  8. Laravel 5.5 使用 Passport 实现 Auth 认证

    最近在写一个前后端分离项目,本来想用 Jwt-auth + Dingo 开发的,但是略感笨重,于是想到了 Laravel 的 Passport 和 5.5 新出的 Api Resource.Larav ...

  9. 【社交系统ThinkSNS+研发日记】Laravel Model 利用 Macroable 为数据模型添加宏能

    2019独角兽企业重金招聘Python工程师标准>>> 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研 ...

最新文章

  1. 第十五届全国大学生智能汽车竞赛 车模检查手册
  2. c#_continue 和 break 的区别
  3. 内核同步对性能的影响及perf的安装和简单的使用
  4. GPS计算司机行车时长,深圳交警开启疲劳驾驶午间整治
  5. java soap 头_如何将java头添加到java中的soaprequest
  6. Apache Flink 零基础入门(十五)Flink DataStream编程(如何自定义DataSource)
  7. python基础实例 韦玮 pdf_Python基础实例教程(微课版)
  8. git、github的基本使用
  9. Windows10 bash 巨硬和Canonical Ltd.的PY交易
  10. postman启动没反应_电脑主机开机但显示器没反应?检查这4个地方,2分钟内找出问题...
  11. kong使用mysql_Kong官方文档翻译:安装Kong
  12. ASP.NET 路由
  13. 点击列表高亮_办公小技巧:妙用条件格式 高亮显示查询结果
  14. C语言指针及C++引用
  15. 算法设计与分析——排序算法:十大排序算法总结
  16. vmplayer7安装OSX10.10
  17. Window 10 python 3.7安装 PyV8
  18. 如何下载静海区卫星地图高清版大图
  19. ECharts南丁格尔玫瑰实现及部分配置解析
  20. 波士顿房价预测python决策树_机器学习第二练---波士顿房价预测

热门文章

  1. UWB 定位_三边定位位置解析算法-C
  2. 学习算法,你需要掌握这些编程基础(包含JAVA和C++)
  3. STM32串口第一字节消失或者误码的原因和解决方案
  4. 一款翻译机背后的全球经济浪潮
  5. 魔兽怎么显示服务器和工会,《魔兽世界》:被玩家集体抵制的迪拜狂鸟,到底是怎样的公会...
  6. PostgreSQL实现批量插入、更新与合并操作的方法_PostgreSQL_脚本之家
  7. 上海锦隆驾校「科目二」2019年考试心得实录
  8. Zebra 打印机 Android 端驱动接口开发及调用案例
  9. 关于网络游戏的游戏策划设计的详述(转)
  10. location allowOverride=false