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條經驗 獲得超7個贊
您需要在子類中定義一個方法。根據手冊,特征的先例是: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 關注
- 178 瀏覽
添加回答
舉報
