사용을 위해 지원되는 클래스를 정의한 동적 구성이 있습니다.
'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] 삭제
몇 마디 만하겠습니다