객체 지향 프로그래밍에서는 상속 수준이 매우 깊어 질 수있는 복잡한 프로젝트에서 클래스 간의 상속 관계를 이해하고 마스터하는 것이 매우 중요합니다. PHP는 클래스와 객체 사이의 상속 관계를 판단하는 몇 가지 유용한 기능을 제공하며, 그 중 is_a () 및 is_subclass_of () 가 가장 일반적으로 사용됩니다. 그러나이 두 기능의 사용 시나리오는 약간 다릅니다. 그것들을 함께 사용하면 객체가 특정 상속 시스템의 일부에 속하는지 더 정확하게 결정할 수 있습니다.
IS_A ()는 객체가 클래스의 인스턴스인지 또는 해당 클래스에서 상속되는지 여부 (직접 및 간접 상속 포함)를 결정하는 데 사용됩니다. 또한 첫 번째 매개 변수로 클래스 이름 문자열을 전달하는 것을 지원합니다.
<?php
class A {}
class B extends A {}
class C extends B {}
$obj = new C();
var_dump(is_a($obj, 'A')); // true
?>
IS_A ()는 객체의 "실제 아이덴티티"를 감지합니다.
is_subclass_of () 클래스 또는 객체가 클래스의 서브 클래스인지 여부를 결정하지만 클래스 자체가 자체 서브 클래스라고 생각하지 않습니다.
<?php
class A {}
class B extends A {}
class C extends B {}
$obj = new C();
var_dump(is_subclass_of($obj, 'A')); // true
var_dump(is_subclass_of('C', 'A')); // true
var_dump(is_subclass_of('A', 'A')); // false
?>
is_subclass_of ()는 실제 유형의 객체 유형이 일치하는지 여부보다 상속 된 구조에 더 중점을 둡니다.
실제 발전에서, 우리는 종종 클래스 나 객체가 기본 클래스 자체를 포함하지 않고 특정 상속 시스템의 서브 클래스에 속하는 지를 판단해야합니다. 이 시점에서 두 기능을 조합하여 각각 기본 클래스 및 비 구인 상황을 필터링 할 수 있습니다.
오용을 피하기 위해 들어오는 클래스가 일부 기본 클래스 정책 ( 정책 자체가 아닌)의 서브 클래스임을 보장 해야하는 정책 로더를 설계한다고 가정 해 봅시다.
<?php
abstract class Policy {
abstract public function apply();
}
class AdminPolicy extends Policy {
public function apply() {
echo "Admin policy applied.";
}
}
class GuestPolicy extends Policy {
public function apply() {
echo "Guest policy applied.";
}
}
function loadPolicy($policyClassName) {
if (!class_exists($policyClassName)) {
throw new InvalidArgumentException("수업은 존재하지 않습니다");
}
if (!is_subclass_of($policyClassName, 'Policy')) {
throw new InvalidArgumentException("해야합니다 Policy 서브 클래스");
}
$policy = new $policyClassName();
$policy->apply();
}
loadPolicy('AdminPolicy');
?>
이 예에서는 IS_A ()를 사용하지 않았기 때문에 들어오는 클래스가 정책 자체가 아니라 정책 의 서브 클래스 인지 확인하려고합니다. 여기에서 is_subclass_of ()를 사용하는 것이 더 적절합니다.
객체가 기본 클래스 자체를 포함하여 특정 상속 시스템의 구성원에 속하는지 여부를 감지 해야하는 경우 IS_A () 가 더 적합합니다.
<?php
function isPolicy($obj) {
return is_a($obj, 'Policy');
}
시스템 멤버를 상속할지 여부 (기본 클래스 포함) : IS_A () 사용
서브 클래스 여부 (기본 클래스 제외) : is_subclass_of () 사용
클래스 이름과 객체 호환성 처리 : 두 기능 모두 클래스 이름과 객체를 지원하지만 모호성을 피하기 위해 의도를 명시 적으로 전달하는 것이 좋습니다.
작은 디버깅 스크립트를 작성하여 클래스 이름 목록과 판단 결과를 테이블에 출력하거나 디버깅 도구를 사용하여 클래스 관계를 자동으로 확인할 수 있습니다. M66.net이 제공하는 PHP 온라인 실행 환경 에서는 이러한 종류의 상속 판단 논리를 신속하게 테스트하여 개발 효율성을 향상시킬 수 있습니다.
PHP의 상속 관계 판단을 다룰 때 IS_A () 및 IS_SUBCLASS_OF () 는 두 가지 기본이지만 매우 중요한 도구입니다. 그들의 차이를 이해하고 합리적으로 사용함으로써, 특히 플러그인 메커니즘, 정책 패턴 또는 공장 패턴과 같은 시나리오와 관련하여보다 강력한 물체 관계 판단 논리를 구축하는 데 도움이 될 수 있습니다.