이 동작을 이해하려면 먼저 PHP 유형 시스템을 이해해야합니다. PHP는 대부분의 경우 자동으로 변환하는 약하게 입력 한 언어입니다. 그러나 PHP는 여전히 내부적으로 명확한 데이터 유형을 유지합니다.
정수
플로트 유형 (더블/플로트)
끈
부울
정렬
물체
의지
널
이것은 1과 1.0이 수치 적으로 동일하더라도 여전히 유형이 다르다는 것을 의미합니다.
is_double ()은 변수가 부동 소수점 유형인지 여부를 감지하는 PHP의 내장 기능입니다. 구현 로직은 실제로 매우 간단합니다. 이는 메모리 변수의 유형 식별자가 "부동 소수점"인지 확인하는 것과 같습니다.
예를 살펴 보겠습니다.
$a = 1;
$b = 1.0;
var_dump(is_double($a)); // bool(false)
var_dump(is_double($b)); // bool(true)
위의 코드에서 변수 $ a는 정수이며, PHP의 "정수"로 엄격하게 식별되고 $ B는 부동 소수점 번호이며 True를 반환합니다.
이것은 기사 제목의 문제를 설명합니다. is_double (1)은 문자 1이 부동 소수점 유형이 아닌 정수이기 때문에 False를 반환합니다.
부동 소수점 번호처럼 보이는 문자열을 통과 할 때 is_double ()가 어떻게 행동 할 것인지 궁금 할 수도 있습니다.
var_dump(is_double('1.0')); // bool(false)
이 결과는 is_double ()가 암시 적 유형 변환을 수행하지 않는다는 것을 다시 보여줍니다. 문자열 '1.0' 은 자동으로 부동 소수점 번호로 해석되지 않습니다. IS_DOUBLE ()은 변수의 내부 유형이 이미 플로트 인 경우에만 true를 반환합니다.
IS_DOUBLE () 에 의존하는 것이 아니라 값을 플로팅 포인트 번호로 해석 할 수 있는지 여부를 결정하는 것이 목적이라면 명시 적으로 변환을 입력하거나 정규 표현식 검증을 사용해야합니다. 예를 들어:
function is_numeric_float($value) {
return is_numeric($value) && (strpos((string)$value, '.') !== false);
}
var_dump(is_numeric_float('1.0')); // bool(true)
또는보다 유연한 검증을 위해 Filter_var ()를 사용할 수 있습니다.
var_dump(filter_var('1.0', FILTER_VALIDATE_FLOAT)); // float(1)
이 유형의 메소드는 특히 사용자 입력 또는 네트워크 요청에서 데이터를 처리 할 때 단순히 IS_Double () 에 의존하는 것보다 실제 개발에서 더 신뢰할 수 있습니다.
일부 데이터 확인 시나리오에서 개발자는 IS_Double () 이 "부동 소수점 번호처럼 보이는 모든 값"을 판단 할 수 있다고 잘못 가정 할 수 있습니다. 예를 들어, 프론트 엔드에서 JSON 요청을 받으면 필드 값은 "1.0" 입니다. IS_DOUBLE ()을 사용하여 직접 확인하면 데이터 형식이 잘못된 것으로 잘못 판단됩니다.
올바른 방법은 is_numeric ()을 형식 확인과 결합하거나 JSON을 구문 분석 할 때 필드 유형을 수동으로 변환하는 것입니다.
$data = json_decode(file_get_contents('https://gitbox.net/data.json'), true);
$price = (float)$data['price'];
if (is_double($price)) {
// 부동 소수점 번호의 안전한 사용
}