PHP의 반사 메커니즘을 통해 개발자는 런타임에 클래스, 인터페이스, 기능, 방법 및 확장의 구조 정보를 확인할 수 있습니다. 가장 간단한 예를 들기 위해 반사 방법을 사용하여 특정 클래스 방법의 매개 변수 정보를 얻을 수 있습니다.
<code> $ method = new ReflectionMethod (myclass :: class, 'myMethod'); $ params = $ method-> getParameters (); </코드>이를 통해 메소드의 매개 변수, 이름, 유형 프롬프트 등의 수를 알 수 있지만 자동으로 유형 확인을 수행하지는 않습니다.
is_a ()는 객체가 런타임시 특정 클래스인지 하위 클래스인지 여부를 결정하는 함수입니다. 구문은 다음과 같습니다.
<code> is_a ($ 객체, $ className, $ allow_string = false) </code>그것의 장점은 강력한 동적이며 특히 유형 검사를위한 반사 메커니즘과 함께 사용하기에 특히 적합합니다.
메소드 서명에 따라 매개 변수를 자동으로 주입하는 데 필요한 종속성 분사 컨테이너를 구축한다고 가정 해 봅시다. 보안상의 이유로, 주입 된 객체가 메소드에 의해 정의 된 유형 제약 조건을 준수하는지 확인하려고합니다.
다음은 반사 + IS_A를 사용하여 엄격한 유형 확인을 구현하는 예입니다.
<code> 함수 invokeWithDependencies ($ className, $ methodName, array $ 종속성) {$ refMethod = new ReflectionMethod ($ className, $ methodName); $ params = $ refMethod-> getParameters (); $resolvedParams = [];
foreach ($params as $param) {
$paramType = $param->getType();
if ($paramType && !$paramType->isBuiltin()) {
$expectedClass = $paramType->getName();
$matched = false;
foreach ($dependencies as $dep) {
if (is_object($dep) && is_a($dep, $expectedClass)) {
$resolvedParams[] = $dep;
$matched = true;
break;
}
}
if (!$matched) {
throw new InvalidArgumentException("No matching dependency for parameter \${$param->getName()} of type $expectedClass");
}
} else {
// 객체가 아닌 유형,기본값을 건너 뛰거나 사용합니다
$resolvedParams[] = $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null;
}
}
return $refMethod->invokeArgs(new $className(), $resolvedParams);
}
</코드>
이 예에서는 $ 종속성 배열의 객체를 비교하여 반사에 의해 얻은 메소드 매개 변수 유형을 반영하고 is_a ()를 사용하여 객체가 실제로 매개 변수 또는 하위 클래스에 필요한 유형인지 확인합니다. 일치하는 종속성을 찾지 못하면 유형이 불일치 한 통화를 피하기 위해 예외가 발생합니다.
종속성 분사 컨테이너와 결합 : 서비스 컨테이너에 인스턴스를 등록 할 때 클래스 이름이 저장되고 호출 할 때 반사 및 IS_A ()를 통해 자동으로 주입됩니다.
인터페이스 및 초록 클래스 처리 : IS_A () 는 인터페이스 및 추상 클래스에도 적용되며 자동 분사 인터페이스 구현에 사용할 수 있습니다.
주의해서 $ allow_string = true 사용 : 문자열 클래스 이름을 활성화하는 것이 유연하지만 발신자를 엄격히 제어하지 않으면 유형 안전을 깨뜨릴 수 있습니다.