Trait 组合与接口
1.Trait 组合的同名方法的命名冲突
insteadof
替换as
改名as
高级用法修改访问控制
<?php
trait trait1
{
public function eat()
{
echo '朱老师是一个吃货吗?';
}
}
trait trait2
{
public function eat()
{
echo '朱老师不是吃货';
}
}
class Nicola
{
use trait1,trait2
{
trait1::eat insteadof trait2;
trait2::eat as eaten;
}
}
2.在 trait 中改变 trait 成员的访问控制
as
高级用法,可以修改 trait 中成员的访问控制
<?php
//trait
trait trait1
{
public function eat()
{
echo '朱老师是一个吃货吗?';
}
}
trait trait2
{
public function eat()
{
echo '朱老师不是吃货';
}
}
class Nicola
{
//修改访问权限
// use trait1 {eat as protected;}
//修改别名
use trait1 {
eat as eat1;
}
}
$nicola = new Nicola;
echo $nicola->eat();
echo '<hr>';
echo $nicola->eat1();
3.trait 实现接口方法的优缺点是什么?
- trait 的出现就像一个小三,能够促进家庭的和谐发展一样,可以横向的在多个家庭间穿梭,大家都喜欢使用。同样,实现接口中定义的抽象方法,而不是通过工作类去实现,展示在用户面前的就只是简单的一个 trait 的引用,代码不仅简单,维护起来也方便。
- 至于缺点我觉得应该就是他优点本身带来的缺点吧。Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
4.实例演示 trait 与接口,抽象类联合编程
- 年终奖抽奖
<?php
//trait和接口的组合
//年终奖抽奖
$prices = ['单车', '摩托', '宝马', '法拉利', '直升机', '战斗机'];
// 接口
interface iKey
{
// 随机抽奖
public static function generateId(int $min, int $max): int;
}
// trait: 真实实现目的
trait tCreateId
{
public static function generateId(int $min, int $max): int
{
return mt_rand($min, $max);
}
}
// 工作类
class DrawPrize implements iKey
{
use tCreateId;
public static function choujiang(array $prices, int $id)
{
return $prices[$id];
}
}
//员工开始抽奖
$id = DrawPrize::generateId(0, 5);
$price = DrawPrize::choujiang($prices, $id);
printf('恭喜你!你的年终奖品是: <span style="color:red">%s</span>', $price);
总结
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。