为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
缥缈止盈 2022-08-19 16:05:04
我有一个使用特征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;}
查看完整描述

2 回答

?
POPMUISE

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


查看完整回答
反对 回复 2022-08-19
?
LEATH

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"


查看完整回答
反对 回复 2022-08-19
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号