PHP에서 IS_A () 함수는 종종 객체가 특정 클래스 또는 하위 클래스에 속하는지 여부를 결정하는 데 사용됩니다. 그러나 클래스가 네임 스페이스를 사용하면 많은 개발자가 IS_A () 판단이 종종 실패하여 코드 논리 예외를 초래한다는 것을 알게됩니다. 이 기사는이 현상의 이유와 IS_A ()를 올바르게 사용하여 네임 스페이스로 클래스를 판단하는 방법을 자세히 분석합니다.
IS_A () 는 PHP의 내장 함수이며 서명은 다음과 같습니다.
is_a(object|string $object_or_class, string $class_name, bool $allow_string = false): bool
첫 번째 매개 변수가 두 번째 매개 변수의 지정된 클래스 또는 하위 클래스의 인스턴스인지 여부를 결정합니다. 예:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
네임 스페이스의 도입은 클래스의 "Fulled Qualified Name"(FQN)이라는 개념을 변경했습니다. 예를 들어:
namespace MyApp\Models;
class User {}
현재 사용자 클래스의 전체 클래스 이름은 간단한 사용자 가 아닌 MyApp \ Models \ User 입니다. IS_A ($ obj, 'user')를 직접 사용하면 실제로 $ obj가 글로벌 네임 스페이스 하에서 사용자 클래스에 속하는지 판단하여 판단이 실패하게됩니다.
다음 코드가 있다고 가정합니다.
namespace MyApp\Models;
class User {}
$user = new User();
var_dump(is_a($user, 'User')); // false,판단하지 못했습니다
실패는 $ 사용자 객체가 MyApp \ Models \ User 에 속하고 '사용자' 는 글로벌 네임 스페이스의 사용자 이며 두 가지는 일치하지 않는다는 것입니다.
글을 쓰는 올바른 방법은 전체 클래스 이름을 전달하는 것입니다.
var_dump(is_a($user, 'MyApp\Models\User')); // true
또는 사용하는 것이 더 안전합니다 :: 클래스 상수 :
var_dump(is_a($user, \MyApp\Models\User::class)); // true
클래스 이름이 동적으로 전달되면 전체 클래스 이름인지 확인하거나 현재 네임 스페이스에 연결하십시오.
$class = 'User';
var_dump(is_a($user, __NAMESPACE__ . '\\' . $class)); // true
is_a () 세 번째 매개 변수 $ allow_string을 사용하면 첫 번째 매개 변수가 객체가되어야하지 않으면 서 들어오는 클래스 이름 문자열이 판단 할 수 있습니다.
var_dump(is_a('MyApp\Models\User', 'MyApp\Models\User', true)); // true
현재 클래스 이름도 완료해야합니다.
네임 스페이스는 클래스의 전체 클래스 이름을 변경하여 IS_A ()가 판단 될 때 전달 해야하는 전체 클래스 이름을 만듭니다.
네임 스페이스가없는 클래스 이름을 전달하면 일반적으로 판단력이 실패합니다.
사용 :: 클래스 상수 또는 전체 문자열이 가장 권장되는 방법입니다.
동적 클래스 이름을 판단 할 때 네임 스페이스를 완료하는 데주의를 기울이십시오.
이를 마스터하면 PHP의 네임 스페이스로 인한 유형의 판단 트랩을 효과적으로 피하고 코드의 견고성과 유지 보수 가능성을 향상시킬 수 있습니다.