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

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


'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 将不会发现该方法来自该类。


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


慕妹3146593
浏览 102回答 1
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为此创建一个类型提示而不是一个抽象类。
打开App,查看更多内容
随时随地看视频慕课网APP