> 백엔드 개발 > PHP 튜토리얼 > PHP가 직면할 수 있는 함정 2

PHP가 직면할 수 있는 함정 2

小云云
풀어 주다: 2023-03-21 17:44:01
원래의
1280명이 탐색했습니다.

앞서 우리는 PHP가 빠질 수 있는 함정 1에 대해 설명했습니다. 이 글에서는 PHP가 빠질 수 있는 함정 2에 대해 알려드리겠습니다.

실제 PHP 개발 과정에서 겪은 함정 중 일부는 저의 이해 부족으로 인해 발생했습니다.

정수와 문자열의 비교에 관해서는 다른 사람들을 위해 이 문제를 한 번 수정했지만, 결국에는 제가 그런 일에 빠지고 싶지 않아 정말 당황스러운 일이 발생하지 않도록 적어 두었습니다. 다시!

이 예를 직접 살펴보겠습니다.

<?php
$foo = 0;
$bar = &#39;a3b4c5&#39;;
if ( $foo < $bar ) {
    echo &#39;output&#39;;
}
로그인 후 복사

출력이 있을까요? 대답은 '아니오'입니다. 왜 그렇습니까? 숫자를 문자열과 비교하면 문자열이 숫자로 변환되기 때문입니다. 이를 정수로 변환하는 intval( $bar ) 함수를 호출하면 그 값이 0임을 알 수 있고 자연스럽게 0보다 크지 않을 것입니다. $bar의 값이 '3a4b5c'이면 숫자로 변환된 문자열의 값이 3이므로 결과가 출력됩니다. 구체적인 변환 규칙은 PHP를 참조하세요. 매뉴얼:

http://us2.php.net/manual/zh/언어.types.string.php#언어.types.string.conversion

실제로 $foo가 ''로 초기화되면 , 두 문자열을 비교하면 실수가 발생하지 않습니다.

또 다른 구덩이를 살펴보겠습니다.

if ( $foo == &#39;a1b2c3&#39; ) {
    echo &#39;output&#39;;
}
로그인 후 복사

이번에도 수출되나요? 대답은 '예'입니다. 이유는 실제로 위와 같습니다. 'a1b2c3'은 비교 중에 암시적으로 유형이 0으로 변환됩니다.

위 문제에 대한 해결책은 암시적인 유형 변환 없이 동일한 유형의 두 숫자를 비교하는 것 이상입니다. 이때 합동 기호(===)가 작용합니다. 왜냐하면 3은 숫자가 동일하기 때문입니다. 값뿐만 아니라 유형도 비교합니다. 또한, 문자열을 비교할 때 strcmp() 함수를 사용하면 이런 문제가 발생하지 않습니다.

또 다른 예:

$checkedKeys = array(&#39;someKey1&#39;, &#39;someKey2&#39;);
$arrTest = array(&#39;someKey1&#39; => &#39;someValue&#39;, &#39;otherValue&#39;);
foreach ($arrTest as $key => $value)
{
	if (in_array($key, $checkedKeys))
	{
		echo "The key valid: $key \n";
	}
}
로그인 후 복사

마찬가지로 여기에는 두 개의 출력이 있으며 두 번째 $key 출력은 0입니다. 이해하셨나요? 해결책은 in_array() 함수에 세 번째 매개변수를 추가하고 이를 true로 설정하여 엄격한 유형 비교를 수행하는 것입니다. 문서는 여기 http://php.net/manual/zh/function.in-array.php

에 있습니다. PHP 언어의 가장 큰 장점 중 하나는 유연성이며, 이는 주의 깊게 작성되지 않은 코드에 숨겨진 위험을 가져오기도 합니다.

관련 추천:

PHP가 빠질 수 있는 Pit 1

위 내용은 PHP가 직면할 수 있는 함정 2의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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