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

如何在不使用注释的情况下推断动态实例化类的类型?

如何在不使用注释的情况下推断动态实例化类的类型?

PHP
慕妹3146593 2023-07-01 15:23:46
我有一个动态配置,其中定义了支持的类以供使用:'registeredRequestParameters' => [    SearchParameter::class,    ReturnsParameter::class,    OrderByParameter::class,    RelationsParameter::class],所有这些类都扩展了一个抽象类AbstractParameter。现在,当我在正在开发的包中注册这些内容时,我正在这样做: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 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信