Trait的概念。在常规的PHP开发中,我们习惯于编写一个通用的基类来实现基本的功能,然后扩展这个基类来创建更具体的子类。直接从父类继承实现。许多编程语言都使用这种继承层次模式。这种典型的继承模型在大多数情况下运行良好,但是如果您希望两个不相关的PHP类在没有继承的情况下表现相似怎么办?Trait就是为了解决这类问题而诞生的。Trait可以将模块化的实现注入到多个不相关的类中,从而提高代码重用性并遵守DRY(Don'tRepeatYourself)原则。从PHP5.4.0开始,PHP实现了一种代码重用的方法,叫做trait。Trait是PHP等单继承语言的一种代码复用机制。为了减少单一继承语言的局限性,Trait使开发者可以在不同的层次结构中自由地复用独立类中的方法。Trait和Class组合的语义定义了一种降低复杂性并避免与传统多重继承和Mixin类相关的典型问题的方法。Trait类似于Class,但仅??旨在以细粒度和一致的方式组合功能。不能由特征本身实例化。在传统继承的基础上增加横向特征组合;也就是说,应用程序的多个类之间不需要继承。简单来说,Trait就是把一些通用的、可重复的方法分离出来,拆分成可重用的组件。最后,只要你在需要的地方使用组件,所有的代码都以【插件】的形式引入。这样的代码可读性更强。如何拆分一段完整的代码,分解出一些可重用的组件,是由我们实际编写代码的场景决定的。比如Laravel队列。Laravel队列Laravel队列为不同的后台队列服务提供统一的API,例如Beanstalk、AmazonSQS、Redis,甚至其他基于关系数据库的队列。队列的目的是延迟处理耗时的任务,例如发送电子邮件,从而大大减少网络请求和相应的时间。队列配置文件存储在config/queue.php中。可以在此文件中找到每个队列驱动程序的配置,包括数据库、Beanstalkd、AmazonSQS、Redis和同步(本机使用)驱动程序。它还包括一个用于放弃队列的任务的空队列驱动程序。创建Laravel队列也很简单,只需要在Jobs目录下创建一个类,并集成ShouldQueue接口即可,如:Queue\InteractsWithQueue;使用Illuminate\Contracts\Queue\ShouldQueue;类SendLogMpMessage实现ShouldQueue{使用InteractsWithQueue、Queueable、SerializesModels;//0:表示接收,1:表示回复$message;公共函数__construct($message){$this->message=$message;}publicfunctionhandle(){$options=['tag'=>'wechat','text'=>$this->message];$this->sendRequest("url",$options,"","POST");}}其他的可以根据需要通过Trait引入,比如上面代码中的三个Trait:InteractsWithQueue、Queueable、SerializesModels,每个Trait各司其职:getProperties();foreach($propertiesas$property){$property->setValue($this,$this->getSerializedPropertyValue($this->getPropertyValue($property)));}}returnarray_map(function($p){return$p->getName();},$properties);}/***序列化后恢复模型。**@returnvoid*/publicfunction__wakeup(){foreach((newReflectionClass($this))->getProperties()as$property){$property->setValue($this,$this->getRestoredPropertyValue($this->getPropertyValue($property)));}}/***获取给定属性的属性值。**@param\ReflectionProperty$属性*@return混合*/protectedfunctiongetPropertyValue(ReflectionProperty$property){$property->setAccessible(true);返回$property->getValue($this);}}这个SerializesModelsTrait的主要作用是,如果你的消息队列构造函数中接收到了Eloguent模型,那么就可以识别出模型的属性会被序列化到队列中。当任务实际运行时,队列系统会自动从数据库中检索完整的模型。整个过程对于这个任务类是完全透明的,根本不需要关心Eloguent模型的序列化和反序列化。如果在任务队列中,不需要导入Eloquent模型,就不需要使用SerializesModels。同理,根据引入不同的Trait来完成相应的功能。总结Laravel框架广泛使用了traits。只要仔细观察,还是能看出这种写法的好处和代码的可扩展性。参考http://php.net/manual/zh/language.oop5.traits.phphttp://d.laravel-china.org/docs/5.4/queues听说最美最帅的人都会给作者打赏,鼓励coding01期待您的关注
