주석을 사용하지 않고 동적으로 인스턴스화 된 클래스의 유형을 추론하는 방법은 무엇입니까?

Norgul

사용을 위해 지원되는 클래스를 정의한 동적 구성이 있습니다.

'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가 해당 메서드가 해당 클래스에서 온다는 것을 인식하지 않기 때문에 실제로 그렇다고 말할 필요 가 있습니다.

주석없이이를 수행 할 수있는 방법이 있습니까?

이비

유형 어노테이션 을 사용하는 데 전혀 문제가 없습니다 . 그것이 그들이 거기에있는 이유입니다.

그러나 적절한 유형 암시 가 더 좋고 더 강력 하다는 데 동의합니다 .

그러나이를 위해 동적 인스턴스화를 사용할 수 없습니다. 대신 추상 팩토리를 사용하십시오. 이렇게하면 코드가 더 명확하고 유연하며 명확 해집니다.

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추상 클래스 대신 이에 대한 유형 힌트를 만들 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관