경우에 따라 PHP는 숫자 데이터(예: 숫자를 포함하는 문자열 등)를 수치 처리로 변환하며 == 연산자가 그 중 하나입니다. == 연산자를 사용하여 두 문자열을 느슨하게 비교할 때 PHP는 비교를 위해 숫자 문자열을 숫자 값으로 변환합니다. 다음 실험은 이 결론을 확인합니다.
<?php var_dump('01' == 1); ?>
위 코드의 출력 결과는 다음과 같습니다. 따라서 문자열을 비교할 때는 === 연산자를 사용하여 문자열을 엄격하게 확인하거나, 발생할 수 있는 문제를 피하기 위해 strcmp()와 같은 함수를 사용하는 것이 좋습니다.
또한 일반적으로 사용되는
() 함수에도 약한 유형 문제가 있습니다. 다음 코드를 참조하세요.
<?php var_dump(in_array('01', array('1'))); ?>
나는 믿습니다. 이 PHP를 사용해 본 적이 있는 기능에 대한 보안 검사를 수행하는 프로그래머들은 이것이 어떤 종류의 보안 문제를 일으킬지 모두 알고 있습니다. 그렇죠? 다행히 in_array() 함수는 세 번째 매개변수를 제공합니다. 이를 true로 설정하면 다음 코드에 표시된 대로 in_array() 함수의 필수 유형 검사 메커니즘을 켤 수 있습니다.
<?php var_dump(in_array('01', array('1'), true)); ?>
PHP는 약한 유형의 언어이기 때문에, 즉 PHP에서는 데이터 유형의 개념이 약합니다. 따라서 프로그래밍할 때 데이터 유형을 너무 많이 무시하면(이는 대부분의 PHP 프로그래머의 일반적인 문제이기도 함) 일부 문제가 발생하고 심지어 보안 취약점도 발생합니다. 마지막으로, 짜증나는 속담처럼 외부 데이터를 엄격하게 확인하고 필터링하세요.
부작용
$a = '212345678912000005'; $b = '212345678912000001'; var_dump($a == $b);이 코드의 출력은 bool(true)입니다. 즉, 이 판단은 in_array() 함수의 세 번째 매개변수가 false일 때 두 개가 동일하다는 결론을 내릴 것임을 의미합니다. 또는 설정되지 않은 상황입니다. 먼저 문자열이 숫자인지 확인한 다음 이를 long 또는 double(C 언어 데이터 유형)로 변환한 다음 zendi_smart_strcmp를 사용하십시오. 그러나 소스 코드의 주석에는 다음과 같이 나와 있습니다. 문은 오버플로 상황을 고려합니다
} else if (dval1 == dval2 && !zend_finite(dval1)) { /* Both values overflowed and have the same sign, * so a numeric comparison would be inaccurate */ goto string_cmp; }dval1과 dval2는 두 문자열을 double 유형으로 변환한 후의 값입니다. 그런데 왜 여전히 이렇습니까? 해결 방법, 두 개의 등호 " 대신 "===" 세 개의 등호를 사용하세요. ==", in_array() 함수에 의해 설정됨 세 번째 매개변수는 true입니다: in_array('val', $array, true).
위 내용은 PHP의 == 연산자 문자열 비교 사용법과 부작용 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!