【问题标题】:How to infer type of a dynamically instantiated class without using annotations?如何在不使用注释的情况下推断动态实例化类的类型?
【发布时间】:2020-10-17 19:46:54
【问题描述】:

我有一个动态配置,其中定义了支持的类以供使用:

'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 将无法识别该方法来自该类。

有没有办法在没有注释的情况下做到这一点?

【问题讨论】:

    标签: php oop php-7


    【解决方案1】:

    使用类型注解绝对没有错。这就是他们的目的。

    但我同意正确的类型提示更好、更健壮。

    但是你不能使用不使用动态实例化。请改用抽象工厂。这将使代码更清晰、更灵活、更明确。

    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 并为此创建类型提示,而不是抽象类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-04
      • 2014-06-18
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2018-09-30
      相关资源
      最近更新 更多