亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是父級::特征的范圍

什么是父級::特征的范圍

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條經驗 獲得超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"


查看完整回答
反對 回復 2022-08-19
  • 2 回答
  • 0 關注
  • 178 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號