在追踪Yii2源码的时候,发现了这个PHP新特性Traits,之前一直觉得PHP不能多重继承是很惆怅的事情,现在看来是自己孤陋寡闻了。好好研读了这个特性的使用,并做了实例,记录一下。 下面PHP手册里对该特性的描述:
自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。 Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。 Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。 ----PHP手册
百度了一下traits(又显得寡闻了);结果是:特性、显著特点。也就用traits定义的类,里面的方法都use它的类中特有的方法。
namespace common\service; /** * 删除的公共方法 * @author Jack */ trait DeleteService { /** * 通过主键删除 * @param int $id * @return int | boolean */ public static function deleteByPk( $id ) { $model = static::find($id); return $model->delete(); } /** * 批量删除 * @param string $condition * @param array $params */ public static function deleteAll( $condition = '', $params = [] ) { return static::deleteAll( $condition = '', $params = [] ); } }定义一个用户操作的类,此类须要实现IUser接口定义方法,默认继承User模型,有删除、更新的特性
<?php namespace common\service; use common\service\IUser; use common\service\DeleteService; use common\service\UpdateService; /** * @author Jack * from www.aipanshi.com */ class UserService extends \models\User implements IUser { use DeleteService, UpdateService; }