PHP에서 IS_A () 함수는 객체가 클래스의 특정 클래스 또는 서브 클래스에 속하는지 여부를 감지하는 데 사용됩니다. 구문은 다음과 같습니다.
is_a(object $object, string $class_name, bool $allow_string = false): bool
그중 첫 번째 매개 변수는 객체 또는 객체 이름이어야하며 두 번째 매개 변수는 클래스 이름입니다. 이 두 매개 변수의 순서가 바뀌면 코드는 무엇을 가지고 있습니까? 이 기사는 예제를 사용하여 잘못된 매개 변수 순서를 사용할 때 IS_A () 의 성능 및 잠재적 위험을 분석합니다.
두 가지 범주가 있다고 가정합니다.
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true,Dog 예 Animal 서브 클래스
var_dump(is_a($dog, 'Dog')); // true,$dog 예 Dog 예
이 코드에서 IS_A ($ dog, 'Animal')는 True를 반환하여 $ Dog Object가 동물 클래스 또는 하위 클래스에 속함을 나타냅니다.
예를 들어 매개 변수 순서를 반대로 작성하면 다음과 같습니다.
var_dump(is_a('Animal', $dog)); // 오류 데모
현재는 어떻게됩니까? 분석하자 :
첫 번째 인수는 대상이 아닌 문자열 '동물' 입니다.
두 번째 매개 변수는 클래스 이름 문자열이 아닌 Object $ Dog 입니다.
IS_A () 의 정의에 따르면,이 함수는 첫 번째 매개 변수가 객체이고 두 번째 매개 변수는 문자열 클래스 이름이고, 순서가 유형 불일치를 유발하도록 반전됩니다.
PHP 7.2 이상은 다음과 같은 경고 또는 오류를 던집니다 .
Warning: is_a() expects parameter 1 to be object, string given
함수는 false를 반환하고 올바르게 판단 할 수 없습니다.
코드 논리가 실패하여 판단력이 실패합니다.
샘플 코드 :
$dog = new Dog();
var_dump(is_a('Animal', $dog)); // false,그리고 경고
is_a ()는 객체 대신 클래스 이름 문자열로 전달되는 첫 번째 매개 변수를 지원하기 위해 세 번째 매개 변수 $ allow_string을 true 로 설정하도록 허용합니다.
var_dump(is_a('Dog', 'Animal', true)); // true,심판 Dog 예否继承 Animal
그러나이 경우에도 두 번째 매개 변수는 여전히 문자열 클래스 이름이어야하며 역 순서는 여전히 오류입니다.
var_dump(is_a('Animal', $dog, true)); // 여전히 틀 렸습니다,매개 변수 순서는 뒤집 혔습니다
is_a () 함수의 첫 번째 매개 변수는 객체 여야합니다 (또는 $ allow_string 이 true 일 때 클래스 이름 문자열이어야합니다). 두 번째 매개 변수는 클래스 이름 문자열이어야합니다.
매개 변수 순서를 되돌리면 유형 불일치가 발생하면 PHP가 경고하고 거짓을 반환하며 판단은 유효하지 않습니다.
매개 변수 전송 오류로 인해 발견하기 어려운 논리적 취약점을 피하기 위해 개발 중 매개 변수 순서에 특별한주의를 기울여야합니다.