1、trait同名方法冲突解决方案
使用 insteadof 操作符来明确指定使用冲突方法中的哪
as 操作符可以 为某个方法引入别名。
注意
as 操作符不会对方法进行重命名,也不会影响其方法代码实例
<?php
//trait组合的同命名方法解决方案
trait tUser1
{
public function getName(){
return $name = "李明";
}
}
trait tUser2
{
public function getName()
{
return $name = "李华";
}
}
trait tUser3
{
use tUser1,tUser2 {
tUser1::getName insteadOf tUser2;
//
tUser2::getName as tU2;
}
}
//工作类
class Infor {
use tUser3;
}
$infor = new Infor();
echo $infor -> getName();
echo"<hr>";
echo $infor -> tU2();
?>
2、trait改变trait成员的访问控制
代码实例
<?php
//trait组合的同命名方法解决方案
trait tUser1
{
public function getName(){
return $name = "李明";
}
}
trait tUser2
{
public function getName()
{
return $name = "李华";
}
}
trait tUser3
{
use tUser1,tUser2 {
tUser1::getName insteadOf tUser2;
tUser2::getName as tU2;
}
//修改访问控制
use tUser1{getName as private tU1;}
}
//工作类
class Infor {
use tUser3;
}
$infor = new Infor();
echo $infor -> tU1();
echo"<hr>";
echo $infor -> tU2();
?>
3、trait的优缺点
优点:代码复用
缺点:由于一个类里面可以引入多个trait,很可能会出现多个trait里面命名冲突的问题
4、trait与接口
代码实例
<?php
//接口
interface iUser1
{
public static function getName();
}
//实现接口
trait tUser1
{
public static function getName(){
return $name="李明" ;
}
}
//工作类
class Infor implements iUser1{
use tUser1;
public static function getSex(){
return $sex = "男";
}
}
$sex = Infor::getSex();
$infor = new Infor();
echo $infor -> getName()."-->" . $sex ;
?>
学习总结
本节课我们学习trait的使用,通过本节课的学习了解了同一个类中引用多个trait同名冲突的解决方案以及trait访问控制的改变。本节课学习的不足之处在于对trait、接口和抽象类的混合编程理解的不透彻,导致想不出具体的案例,在以后的教学中多注意观察和实践解决这些遗留问题。