>php教程 >php手册 >PHP 약한 유형 안전 문제에 대한 참고 사항

PHP 약한 유형 안전 문제에 대한 참고 사항

WBOY
WBOY원래의
2016-09-20 03:30:261102검색

1. 유형 변환 문제

 <span style="color: #008080;">intval</span><span style="color: #000000;">();

 

    </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">intval</span>('1asdfasd'));  <span style="color: #008000;">//</span><span style="color: #008000;">1</span>

    <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">intval</span>('awqw12'));  <span style="color: #008000;">//</span><span style="color: #008000;">0</span>

    <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">intval</span>(<span style="color: #0000ff;">array</span>()));    <span style="color: #008000;">//</span><span style="color: #008000;">0</span>

    <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">intval</span>(<span style="color: #0000ff;">array</span>('foo','val'))); <span style="color: #008000;">//</span><span style="color: #008000;">1</span>

    <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">intval</span>(0x1A)); <span style="color: #008000;">//</span><span style="color: #008000;">26  十六进制转换</span>

    <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">intval</span>('asdfqwer')); <span style="color: #008000;">//</span><span style="color: #008000;">0</span>

   

intval 변환된 값이 문자열인 경우 오류를 반환하지 않고 0을 반환합니다. 변환된 값이 배열인 경우 두 가지 상황이 있습니다. 변환된 값이 빈 배열인 경우 0을 반환합니다. , 그렇지 않으면 1을 반환합니다

참고: PHP는 32비트 메모리를 사용하여 정수를 저장합니다. 32비트는 4294967296 숫자를 나타낼 수 있습니다. 부호가 있는 경우 -2147483647부터 2147483648까지입니다.

2. 내장 기능의 느슨함 문제

 switch();

 

     $i='3adcd';

     switch($i){

              case 1:

                     echo 'i is 1';

                     break;

              case 2:

                     echo 'i is 2';

                     break;

              case 3:

                     echo 'i is 3';

                     break;

              default:

                    echo 'i is default';

                    break;

     }

위의 결과는 스위치 케이스 3에 들어갑니다. 왜 이런 일이 발생합니까? 스위치가 숫자 유형 케이스인 경우 스위치는 매개변수를 int 클래스로 변환하므로 위의 실행 시 $i가 먼저 유형 변환이 수행됩니다. 변환 결과는 3입니다. . .

  <span style="color: #008080;">in_array</span><span style="color: #000000;">();

    </span><span style="color: #800080;">$arr</span> = [0,1,2,3,'test'<span style="color: #000000;">];

    </span><span style="color: #008080;">var_dump</span>(<span style="color: #008080;">in_array</span>('abd',<span style="color: #800080;">$arr</span>));    <span style="color: #008000;">//</span><span style="color: #008000;"> true</span>

    <span style="color: #008080;">var_dump</span>(<span style="color: #008080;">in_array</span>('1bc',<span style="color: #800080;">$arr</span>));    <span style="color: #008000;">//</span><span style="color: #008000;"> true</span>

위의 실행 결과가 왜 이런 걸까요? 나중에 매뉴얼을 쿼리해 보니 in_array는 기본적으로 값이 같은지 비교만 하고 유형이 같은지는 비교하지 않는 느슨한 비교 방식으로 되어 있다고 공식적으로 나와 있습니다. 값이 동일하므로 위의 내용이 있습니다. 이 결과에 대해서는 in_array 함수의 세 번째 매개변수를 True로 설정하는 것이 엄격한 비교 방법입니다.

위의 사항은 일상적인 개발에서 주의해야 할 모든 사항입니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.