bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class : 확인할 객체 또는 클래스 이름 ( $ allow_string = true가 설정된 경우).
$ 클래스 : 비교할 대상 클래스 이름.
$ allow_string : 들어오는 클래스 이름 문자열을 첫 번째 매개 변수로 허용할지 여부 ( 기본값 , php 5.3.9+에서만 지원).
함수는 부울 값을 반환합니다. true $ object_or_class 는 $ class 클래스 또는 서브 클래스의 인스턴스 인 경우; 그렇지 않으면, 거짓 .
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "예 Animal 클래스 또는 하위 클래스 인스턴스";
} else {
echo "不예 Animal 클래스 또는 하위 클래스 인스턴스";
}
산출:
예 Animal 클래스 또는 하위 클래스 인스턴스
이 예에서는 $ dog가 개 사례이지만 개는 동물을 물려 받기 때문에 is_a ()는 True를 반환합니다.
때로는 인스턴스 객체 대신 클래스 이름 문자열 만 가질 수 있습니다. 세 번째 매개 변수 $ allow_string = true를 설정하여 클래스 간의 상속 관계를 결정할 수 있습니다.
class Animal {}
class Cat extends Animal {}
$className = 'Cat';
if (is_a($className, 'Animal', true)) {
echo "$className 예 Animal 서브 클래스 또는 그 자체";
}
이것은 반사 또는 종속성 주입과 같은 동적 클래스 이름을 다룰 때 매우 유용합니다.
컨텐츠 관리 시스템에 여러 프로세서 클래스가 있다고 가정 해 봅시다. 각 클래스는 추상 클래스 베이스 프로세서 에서 상속됩니다. 실행하기 전에 현재로드 된 프로세서 클래스가 준수되는지 확인하려고합니다.
abstract class BaseProcessor {
abstract public function process();
}
class MarkdownProcessor extends BaseProcessor {
public function process() {
// 거래하십시오 Markdown 콘텐츠
}
}
function runProcessor($processor) {
if (!is_a($processor, 'BaseProcessor')) {
throw new Exception("无效거래하십시오器!");
}
$processor->process();
}
$proc = new MarkdownProcessor();
runProcessor($proc);
통과 된 물체가 기본 프로세서를 상속하지 않는 객체 인 경우 시스템은 런타임 오류를 피하기 위해 예외를 던집니다.
PHP에는 운영자 인스턴스가 있으며, 이는 유사한 판단에도 사용될 수 있습니다. 그렇다면 IS_A () 와 인스턴스 의 차이점은 무엇입니까?
비교하다 | is_a () | 인스턴스 |
---|---|---|
유형 | 기능 | 연산자 |
문자열을 허용하십시오 | 예 (세 번째 매개 변수는 사실이어야합니다) | 아니요 |
가독성 | 더 나은 (더 많은 논리) | 보다 일반적으로 사용되는 간결한 문법 |
버전 지원 | PHP 4+, PHP 5.3.9+는 문자열 판단을 지원합니다 | PHP 5+ |
실제 개발에서 객체 인스턴스 판단 인 경우 인스턴스를 사용하는 것이 더 일반적입니다. 클래스 이름 문자열을 판단 해야하는 경우 IS_A () 가 더 적합합니다.
성능 문제 : IS_A () 는 하단의 반사 작업이므로 인스턴스 보다 약간 느리지 만 고주파 호출로 고려할 필요가 없다면 간격은 매우 작습니다.
클래스가 존재하는지 : IS_A ()를 사용하기 전에 대상 클래스가 존재하는지 확인하십시오. 그렇지 않으면 오류가 발생할 수 있습니다. class_exists ()를 사용하여 먼저 판단을 할 수 있습니다.
PSR 사양 및 설계 아이디어 : IS_A () 의 합리적인 사용은 유형 안전을 향상시킬 수 있지만 과도한 의존성은 개방성과 폐쇄의 원리를 위반할 수도 있습니다. 인터페이스와 함께 사용하는 것이 좋습니다.