PHP-trait-笔记
程序员文章站
2024-02-19 15:01:46
...
trait
trait是一种代码复用的方法,用于模拟实现多继承(PHP是单继承语言)
注意:
1.trait中的写法和普通的类写法一样(不过一般我们只写方法)
2.如果trait中的属性与类中的属性同名,则会报告错误
3.trait无法被new实例化
4.trait可以嵌套trait
源代码:
<?php
trait A
{
function go()
{
echo "Go<br />";
}
}
trait B
{
use A;//嵌套trai A
function ao()
{
echo "Ao<br />";
}
}
class C
{
use B;//复用trait B的代码
}
$p = new C();
$p->go();//调用复用的代码
$p->ao();
?>
显示:
Go
Ao
解决方法同名问题:
关键字:insteadof 代替(instead of) as 别名
源代码:
<?php
trait A
{
function go()
{
echo "去那<br />";
}
}
trait B
{
function go()
{
echo "走呀<br />";//方法名与trait A中的重复
}
}
class C
{
use A,B
{
A::go insteadof B;//trait A中的go()代替trait B中的go()
B::go as goB;//将trait B中的go取个别名为goB
}
}
$p = new C();
$p->go();//调用的trait A中的go()方法
$p->goB();//调用取别名的trait B的go()方法
?>
显示:
去那
走呀
关于优先级问题:
子类是先继承父类,再使用trait复用代码,所以当继承和trait同时使用的时候父类的成员方法与trait方法同名时会被trait方法重写,但是我们可以通过parent解决这个问题
源代码:
<?php
class A
{
function Ton()
{
echo "你";
}
}
trait B
{
function Ton()//该方法于class A中的Ton()方法同名
{
parent::Ton();//我们可以通过调用原来的方法来解决重写问题
echo "好";
}
}
class C extends A
{
use B;
}
$p = new C();
$p->Ton();
?>
显示:
你好