약한 타이핑의 PHP 작은 함정

WBOY
풀어 주다: 2016-08-08 09:31:38
원래의
1145명이 탐색했습니다.

오늘 그룹에서 논의된 문제를 녹음해 주세요.

문제의 원인은
var_dump(md5('240610708') == md5('QNKCDZO')) //true
두 개의 md5 문자열을 사용하세요. 비교 연산자(==)는 같은 것으로 판명됩니다.
다음 두 값이 출력됩니다:
md5('240610708') //0e462097431906509019562988736854
md5('QNKCDZO') //0e83040045199349405802 4219 903391

결과를 보면, 아니요. 언뜻 보면 intval인 것 같아서 0 == 0이 true를 반환했습니다.
나중에 확인해보니 그렇지 않았습니다.
php 비교 연산자:
http://php.net/manual/zh/언어.operators.comparison.php
예:

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
로그인 후 복사
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}
?>
로그인 후 복사

즉, , 이 동일성은 두 문자열이 intval이고 0=0
이 되기 때문이 아니라 수치적으로는 0e4xxx == 0e8xxx(과학 표기법), 0*10의 n승, 즉 0.0000과 0.00000000입니다
그러면 동등한 결과가 나올 것입니다.

위 내용은 PHP에 약한 타이핑의 작은 함정을 소개했으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿