IS_A ()는 객체가 특정 클래스의 인스턴스인지 또는 해당 클래스에서 상속되는지 여부를 결정하는 데 사용됩니다. 함수 서명은 다음과 같습니다.
is_a(object $object, string $class_name, bool $allow_string = false): bool
$ 객체 : 감지 할 객체 (또는 클래스 이름, $ allow_string 에 따라).
$ class_name : 대상 클래스 이름 문자열.
$ alc
예를 들어:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
var_dump(is_a($dog, 'Dog')); // true
PHP 클래스 이름은 사례에 민감하지만 IS_A ()가 판단 될 때 전달 된 클래스 이름 문자열은 혼란을 유발할 수 있습니다. 특히 클래스 이름이 동적으로 통과 될 때.
예:
$className = 'dog'; // 소문자
var_dump(is_a($dog, $className)); // false
개와 개는 동일한 클래스를 나타내지 만 IS_A () 의 구현 메커니즘으로 인해 False가 여기에서 반환됩니다.
해결책:
동적으로 전달 된 클래스 이름이 올바른 경우에 있거나 클래스의 실제 이름으로 변환되어 있는지 확인하십시오. get_class () 또는 class_exists ()를 사용하여 먼저 확인할 수 있습니다.
$className = 'dog';
if (class_exists(ucfirst($className))) {
$className = ucfirst($className);
}
var_dump(is_a($dog, $className)); // true
첫 번째 매개 변수가 클래스 이름 문자열 인 경우 기본값 IS_A ()는 판단을하지 않지만 False를 반환합니다.
var_dump(is_a('Dog', 'Animal')); // false
클래스 이름 문자열을 기반으로 판단을 달성하려면 세 번째 매개 변수 를 전달해야합니다.
var_dump(is_a('Dog', 'Animal', true)); // true
이것은 문자열의 계급 관계를 동적으로 판단하는 데 의존하는 일부 시나리오에서 매우 중요합니다.
동적 클래스 이름에는 종종 네임 스페이스가 포함되어 있으며 전체 네임 스페이스 클래스 이름을 사용해야합니다.
namespace m66\Animals;
class Dog {}
$dog = new Dog();
var_dump(is_a($dog, 'm66\Animals\Dog')); // true
동적으로 전달 된 클래스 이름에 네임 스페이스가 포함되어 있지 않으면 판단 실패가 발생합니다.
동적으로 전달 된 클래스 이름이 아직로드되지 않은 경우 IS_A () 도 False를 반환합니다. 관련 클래스가 자동 로더를 통해 포함되거나로드되었는지 확인하십시오.
<?php
namespace m66\net;
class Animal {}
class Dog extends Animal {}
function checkInstance($obj, $dynamicClassName)
{
// 표준화 된 동적 클래스 이름
$dynamicClassName = trim($dynamicClassName);
if (!class_exists($dynamicClassName)) {
// 자동 로딩 메커니즘을 가정합니다,여기서 오류를 던지기 위해 단순화됩니다
throw new \Exception("Class $dynamicClassName 존재하지 않습니다");
}
return is_a($obj, $dynamicClassName);
}
$dog = new Dog();
try {
$result = checkInstance($dog, 'm66\net\Animal');
echo $result ? '예 Animal 또는 서브 클래스' : '不예 Animal 친절한';
} catch (\Exception $e) {
echo $e->getMessage();
}