2 回答

TA贡献1765条经验 获得超5个赞
Trait 方法的行为就像它们是在类中使用 trait 声明的,即
trait MyTrait {
public function getName() : string
{
return parent::getName() . '_special';
}
}
class MyClass extends MyParentClass {
use MyTrait;
}
在功能上与
class MyClass extends MyParentClass {
public function getName() : string
{
return parent::getName() . '_special';
}
}
应该清楚的是,在这种情况下指的是 。如果有任何疑问,请使用以下代码:parentMyParentClass
<?php
trait MyTrait {
public function getName() : string
{
return parent::getName() . '_special';
}
}
class MyParentClass {
public function getName(): string
{
return "MyName";
}
}
class MyClass extends MyParentClass {
use MyTrait;
}
$instance = new MyClass();
echo $instance->getName();
生成以下输出:
MyName_special
这可以使用 trait 方法中的 (ref) 进一步测试/演示,该方法返回 。return parent::class;MyParentClass

TA贡献1936条经验 获得超6个赞
您需要在子类中定义一个方法。根据手册,特征的先例是:getName()
从基类继承的成员被 Trait 插入的成员覆盖。优先顺序是当前类中的成员重写 Trait 方法,而这些方法又会覆盖继承的方法。
这意味着,由于子类中没有方法,因此 trait 方法优先,覆盖父方法。对于子类中的方法,它优先。getName()getName()
因此,您需要执行类似如下操作,请注意该方法在 trait 用法中的别名:getName()
trait MyTrait {
public function getName() : string
{
return parent::getName() . '_special';
}
}
class MyParentClass {
public function getName(): string
{
return "MyName";
}
}
class MyClass extends MyParentClass {
use MyTrait {
MyTrait::getName as getTraitName;
}
public function getName(): string
{
return parent::getName();
}
}
$myClass = new MyClass();
var_dump($myClass->getName()); //string(6) "MyName"
var_dump($myClass->getTraitName()); //string(14) "MyName_special"
- 2 回答
- 0 关注
- 137 浏览
添加回答
举报