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