앞서 우리는 PHP가 빠질 수 있는 함정 1에 대해 설명했습니다. 이 글에서는 PHP가 빠질 수 있는 함정 2에 대해 알려드리겠습니다.
실제 PHP 개발 과정에서 겪은 함정 중 일부는 저의 이해 부족으로 인해 발생했습니다.
정수와 문자열의 비교에 관해서는 다른 사람들을 위해 이 문제를 한 번 수정했지만, 결국에는 제가 그런 일에 빠지고 싶지 않아 정말 당황스러운 일이 발생하지 않도록 적어 두었습니다. 다시!
이 예를 직접 살펴보겠습니다.
<?php $foo = 0; $bar = 'a3b4c5'; if ( $foo < $bar ) { echo 'output'; }
출력이 있을까요? 대답은 '아니오'입니다. 왜 그렇습니까? 숫자를 문자열과 비교하면 문자열이 숫자로 변환되기 때문입니다. 이를 정수로 변환하는 intval( $bar ) 함수를 호출하면 그 값이 0임을 알 수 있고 자연스럽게 0보다 크지 않을 것입니다. $bar의 값이 '3a4b5c'이면 숫자로 변환된 문자열의 값이 3이므로 결과가 출력됩니다. 구체적인 변환 규칙은 PHP를 참조하세요. 매뉴얼:
http://us2.php.net/manual/zh/언어.types.string.php#언어.types.string.conversion
실제로 $foo가 ''로 초기화되면 , 두 문자열을 비교하면 실수가 발생하지 않습니다.
또 다른 구덩이를 살펴보겠습니다.
if ( $foo == 'a1b2c3' ) { echo 'output'; }
이번에도 수출되나요? 대답은 '예'입니다. 이유는 실제로 위와 같습니다. 'a1b2c3'은 비교 중에 암시적으로 유형이 0으로 변환됩니다.
위 문제에 대한 해결책은 암시적인 유형 변환 없이 동일한 유형의 두 숫자를 비교하는 것 이상입니다. 이때 합동 기호(===)가 작용합니다. 왜냐하면 3은 숫자가 동일하기 때문입니다. 값뿐만 아니라 유형도 비교합니다. 또한, 문자열을 비교할 때 strcmp() 함수를 사용하면 이런 문제가 발생하지 않습니다.
또 다른 예:
$checkedKeys = array('someKey1', 'someKey2'); $arrTest = array('someKey1' => 'someValue', 'otherValue'); 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가 직면할 수 있는 함정 2의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!