매일 PHP 개발에서는 종종 변수가 특정 클래스의 인스턴스인지 확인해야합니다. PHP는 운영자 인스턴스 와 같은 유형을 판단하는 다양한 방법을 제공하지만 IS_A () 함수는 유연성과 단순성으로 인해 많은 개발자에게 첫 번째 선택이되었습니다.
이 기사에서는 IS_A () 함수를 기반으로 간단한 유형 확인 도구 클래스를 구축하기 위해 단계별로 사용하여 객체 유형을 신속하게 판단하고 코드 가독성 및 재사용 성을 향상시킬 수 있습니다.
IS_A () 는 PHP가 제공하는 내장 함수이며, 객체가 해당 클래스의 특정 클래스 또는 하위 클래스에 속하는지 여부를 결정하는 데 사용됩니다.
bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class : 확인할 객체 또는 클래스 이름입니다.
$ 클래스 : 대상 클래스 이름.
$ allow_string : 객체 이름을 문자열로 전달할 수 있는지 여부 (정적 호출의 경우).
우리는 IS_A () 함수를 사용하여 간단한 도구 클래스 타자기를 캡슐화하여 유형 판단 로직을 단순화하고 중앙에서 관리합니다.
<code>
class TypeChecker
{
/**
* 개체가 특정 클래스의 인스턴스인지 결정
*
* @param object|string $objectOrClass
* @param string $expectedClass
* @param bool $allowString
* @return bool
*/
public static function isInstanceOf($objectOrClass, string $expectedClass, bool $allowString = false): bool
{
return is_a($objectOrClass, $expectedClass, $allowString);
}
/**
* 여러 개체 유형의 배치 검증
*
* @param array $objectsWithExpectedClasses
* @return array
*/
public static function validateMultiple(array $objectsWithExpectedClasses): array
{
$results = [];
foreach ($objectsWithExpectedClasses as $label => [$objectOrClass, $expectedClass]) {
$results[$label] = self::isInstanceOf($objectOrClass, $expectedClass);
}
return $results;
}
}
</code>
이 클래스는 두 가지 방법을 제공합니다.
isinstanceof () : 단일 객체의 유형을 확인하십시오.
ValidAmultiple () : 객체와 클래스 사이의 해당에 대한 배치 검증을 지원합니다.
이 도구 클래스가 실제 프로젝트에서 어떻게 사용되는지 살펴 보겠습니다.
<code>
interface LoggerInterface {}
class FileLogger implements LoggerInterface {}
class MailLogger {}
$logger1 = new FileLogger();
$logger2 = new MailLogger();
// 단일 검증
if (TypeChecker::isInstanceOf($logger1, LoggerInterface::class)) {
echo "logger1 예 LoggerInterface 예\n";
}
// 배치 검증
$results = TypeChecker::validateMultiple([
'fileLogger' => [$logger1, LoggerInterface::class],
'mailLogger' => [$logger2, LoggerInterface::class],
]);
print_r($results);
</code>
출력 결과는 다음과 같습니다.
logger1 예 LoggerInterface 예
Array
(
[fileLogger] => 1
[mailLogger] =>
)
구성 파일에서 클래스를 동적으로로드하고 개체를 인스턴스화하는 공장 클래스를 개발한다고 가정 해 봅시다. TypEchecker를 사용하여 이러한 클래스가 원하는 인터페이스를 구현하고 런타임에서 유형 오류를 피할 수 있습니다.
<code>
class LoggerFactory
{
public static function create(string $className): LoggerInterface
{
$instance = new $className();
if (!TypeChecker::isInstanceOf($instance, LoggerInterface::class)) {
throw new InvalidArgumentException("친절한 $className 달성해야합니다 LoggerInterface 인터페이스");
}
return $instance;
}
}
$logger = LoggerFactory::create('FileLogger'); // 정상
$logger = LoggerFactory::create('MailLogger'); // 예외를 던지십시오
</code>
IS_A ()를 통해 간단한 유형 확인 도구 클래스를 캡슐화하면 코드의 견고성과 가독성이 크게 향상 될 수 있습니다. 중소 규모 프로젝트의 기본 유형 감지 또는 대형 프레임 워크의 보안 검사 계층으로 유용 할 수 있습니다.
완전한 검증 시스템을 더 구축하려면 URL 소스 및 종속성 주입 클래스와 같은 논리를 추가하여 확인할 수도 있습니다. 예를 들어, 서비스 레지스트리에서 클래스가 필요한 인터페이스를 구현하는지 또는 특정 기본 클래스를 상속하는지 여부를 확인하면 비즈니스 로직에서 숨겨진 오류를 방지 할 수 있습니다.