Trait
Trait基础知识
命名冲突解决办法:1.
insteadOf
重命名; 2.as
别名
在trait中改变trait成员的访问控制as
演示Trait命名冲突的解决和改变trait成员的访问控制:
<?php
// 解决trait组合中的方法命名冲突
trait tDemo1
{
public function show()
{
echo 'trait: tDemo1; 方法: show';
}
}
trait tDemo2
{
public function show()
{
echo 'trait: tDemo2; 方法: show';
}
}
// 创建一个trait引用上面两个trait
trait tDemo3
{
use tDemo1, tDemo2 {
// 1. 替代: 没有了
tDemo1::show insteadOf tDemo2;
// 2. 别名: 换个名字,两个都还在
tDemo2::show as showtd2;
}
// as: 修改trait成员的访问控制
use tDemo1 {show as protected showtd1;}
}
// 工作类
class Lamviec
{
use tDemo3;
}
// 客户端
$lamviec = new Lamviec();
// 调用的是tDemo1的方法
$lamviec->show();
echo '<hr>';
// 调用的是tDemo1的方法
$lamviec->showtd2();
echo '<hr>';
// 修改tDemo1中方法的访问控制,后不能访问
// echo $lamviec->showtd1();
效果图:
trait 实现接口方法的优缺点
1. trait优点
间接实现类的横向多继承;可以先把接口中的方法分开trai中实现,然后同时引用多个trait,方便调用,方便维护。
2. trait缺点
在trait中实现接口方法不能调用抽象类中已经实现过的方法。(如我案例中,想在trait中使用
$base
)
实例演示trait与接口、抽象类相接合编程
<?php
// 在接口中声明4个接口方法
interface iMeritpay
{
public function base(int $coban, int $hieuq, int $chucv);
public function vanphong (float $diem, int $base);
public function sanxuat (float $diemcanhan, float $diemxuong, int $base);
public function xuong (float $diem, int $base);
}
// 抽象类实现base()接口方法
abstract class aBase implements iMeritpay
{
public function base(int $coban, int $hieuq, int $chucv)
{
return $coban + $hieuq + $chucv;
}
}
// 在trait中实现接口的方法
trait tVanphong
{
public function vanphong (float $diem, int $base)
{
return (($diem-100)/100) * $base * 0.6;
}
}
trait tSanxuat
{
public function sanxuat (float $diemcanhan, float $diemxuong, int $base)
{
return ((($diemcanhan * 0.5 + $diemxuong * 0.5)-100) / 100) * $base * 0.8;
}
}
trait tXuong
{
public function xuong (float $diem, int $base)
{
return (($diem-100)/100) * $base;
}
}
// 声明一个大的trait引入上面的三个小trait
trait tCachtinh
{
use tVanphong, tSanxuat, tXuong;
}
// 创建工作类引入trait,就不用再实现接口方法
class Tinhra extends aBase
{
use tCachtinh;
}
// 客户端调用
$tinhra = new Tinhra;
$base = $tinhra->base(510, 210, 200);
// 计算vanphong
echo $tinhra->vanphong(116.8, $base) .'<hr>';
// 计算sanxuat
echo $tinhra->sanxuat(116.8, 120.31, $base) .'<hr>';
// 计算xuong
echo $tinhra->xuong(116.8, $base) .'<hr>';
效果图: