什么是父级::特征的范围

我有一个使用特征MyTrait的类MyClass。它们都有一个方法getName()(MyClass从MyParentClass继承它)。


MyTrait::getName() 的父范围是什么?在MyTrait上下文中调用MyClass::getName()和MyParentClass::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;


}



缥缈止盈
浏览 138回答 2
2回答

POPMUISE

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

LEATH

您需要在子类中定义一个方法。根据手册,特征的先例是:getName()从基类继承的成员被 Trait 插入的成员覆盖。优先顺序是当前类中的成员重写 Trait 方法,而这些方法又会覆盖继承的方法。这意味着,由于子类中没有方法,因此 trait 方法优先,覆盖父方法。对于子类中的方法,它优先。getName()getName()因此,您需要执行类似如下操作,请注意该方法在 trait 用法中的别名:getName()trait MyTrait {&nbsp; &nbsp; public function getName() : string&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return parent::getName() . '_special';&nbsp; &nbsp; }}class MyParentClass {&nbsp; &nbsp; public function getName(): string&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return "MyName";&nbsp; &nbsp; }}class MyClass extends MyParentClass {&nbsp; &nbsp; use MyTrait {&nbsp; &nbsp; &nbsp; &nbsp; MyTrait::getName as getTraitName;&nbsp; &nbsp; }&nbsp; &nbsp; public function getName(): string&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return parent::getName();&nbsp; &nbsp; }}$myClass = new MyClass();var_dump($myClass->getName()); //string(6) "MyName"var_dump($myClass->getTraitName()); //string(14) "MyName_special"
打开App,查看更多内容
随时随地看视频慕课网APP