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

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

如何在不使用注釋的情況下推斷動態實例化類的類型?

如何在不使用注釋的情況下推斷動態實例化類的類型?

PHP
慕妹3146593 2023-07-01 15:23:46
我有一個動態配置,其中定義了支持的類以供使用:'registeredRequestParameters' => [    SearchParameter::class,    ReturnsParameter::class,    OrderByParameter::class,    RelationsParameter::class],所有這些類都擴展了一個抽象類AbstractParameter?,F在,當我在正在開發的包中注冊這些內容時,我正在這樣做:foreach ($this->requestParameters as $parameter) {    /**     * @var AbstractParameter $instance     */    $instance = new $parameter($this->request, $this->builder, $this->configModel);    $instance->appendQuery();}這工作正常,但我需要說這$instance實際上是一個AbstractParameter,因為否則我的 IDE 將不會發現該方法來自該類。有沒有辦法在沒有注釋的情況下做到這一點?
查看完整描述

1 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

使用類型注釋絕對沒有任何問題。這就是他們存在的目的。


但我同意正確的類型提示更好、更穩健。


但為此,您不能使用動態實例化。請改用抽象工廠。這將使代碼更清晰、更靈活、更明確。


abstract class ParameterFactory {

    

    public static parameter($type, $request, $builder, $configModel) : AbstractParameter

    {

        

        switch ($type) {

            case SearchParameter::class:

                return new SearchParameter($request, $builder, $configModel);

            case ReturnsParameter::class:

                return new ReturnsParameter($request, $builder, $configModel);

            case OrderByParameter::class:

                return new OrderByParameter($request, $builder, $configModel);

            case RelationsParameter::class:

                return new OrderByParameter($request, $builder, $configModel);

        }


        throw new \InvalidArgumentException("Class $type not supported by factory");

            

    }

}

然后你會這樣做:


foreach ($this->requestParameters as $parameter) {  

    $instance = ParameterFactory::parameter(parameter, $this->request, $this->builder, $this->configModel);

    $instance->appendQuery();

}

順便說一句,我會ParameterInterface為此創建一個類型提示而不是一個抽象類。


查看完整回答
反對 回復 2023-07-01
  • 1 回答
  • 0 關注
  • 132 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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