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

Php 如何在不使用注释的情况下推断动态实例化类的类型?,php,oop,php-7,Php,Oop,Php 7,我有一个动态配置,其中定义了支持的类以供使用: 'registeredRequestParameters' => [ SearchParameter::class, ReturnsParameter::class, OrderByParameter::class, RelationsParameter::class ], 所有这些类都扩展了一个抽象类AbstractParameter 现在,当我在我开发的软件包中注册这些软件时,我会这样做: foreach

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

'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
实际上是一个
抽象参数
,因为否则我的IDE将无法识别该方法来自该类


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

使用类型注释绝对没有问题。这就是他们在那里的目的

但我同意适当的类型暗示是更好、更可靠的

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

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();
}
另外,我将创建一个
参数接口
,并为此键入提示,而不是一个抽象类