더 깊이 들어가기 전에 STRCMP 의 기본 사용법을 살펴 보겠습니다.
<?php
$result = strcmp("apple", "banana");
echo $result; // 출력 음수,왜냐하면 "apple" 보다 적습니다 "banana"
?>
strcmp 의 반환 값의 의미는 다음과 같습니다.
0 미만 : 첫 번째 문자열은 두 번째 문자열보다 작습니다.
0과 같다 : 두 줄은 같다
0보다 큽니다 : 첫 번째 문자열은 두 번째 문자열보다 큽니다.
비어있는 문자열이있는 경우 예를 들어
<?php
$str1 = "";
$str2 = "banana";
$result = strcmp($str1, $str2);
echo $result; // 출력 음수
?>
결과는 여전히 부정적입니다. 이것은 strcmp가 빈 줄을 올바르게 처리 할 수 있으며 오류를보고하지 않을 것임을 보여줍니다. 그러나 문제는 - 그러한 비교를 기대합니까?
많은 프로그래머가 STRCMP를 사용하는 경우, 실제 의도는 두 "비어 있지 않은"문자열이 동일한 지 여부를 결정하는 것입니다. 그들 중 하나가 비어 있으면 비즈니스 논리에 문제가 있다는 것을 의미 할 수 있습니다. 예를 들어, 사용자가 사용자 이름을 비어 있고 다른 하나는 데이터베이스의 기존 사용자 이름 인 경우 사용자 이름이 먼저 비어 있는지 확인해야합니까?
<?php
if ($str1 === "" || $str2 === "") {
echo "적어도 하나의 문자열이 비어 있습니다,비교할 수 없습니다。";
} else {
if (strcmp($str1, $str2) === 0) {
echo "두 줄은 동일합니다";
} else {
echo "두 줄은 다릅니다";
}
}
?>
이렇게하면 논리적 오류를 피할 수 있습니다. STRCMP 자체가 빈 문자열을 처리 할 수 있더라도 비즈니스 관점에서 빈 문자열인지 먼저 결정하는 것이 더 안전합니다.
<?php
if ($str1 == $str2) {
echo "동일한";
}
?>
이 글쓰기는 더 간단하지만 일부 경우 유형 변환 문제로 이어질 수 있습니다.
<?php
$str1 = 0;
$str2 = "a";
if ($str1 == $str2) {
echo "동일한"; // 산출,왜냐하면 "a" 변환됩니다 0
}
?>
따라서 느슨한 비교 대신 strcmp 또는 ===를 사용하는 것이 좋습니다.
<?php
function isValidUsername($input) {
$reserved = "admin";
if (trim($input) === "") {
return "사용자 이름은 비어있을 수 없습니다";
}
if (strcmp($input, $reserved) === 0) {
return "사용자 이름을 예약 할 수 없습니다";
}
return "유효한 사용자 이름";
}
echo isValidUsername(""); // 사용자 이름은 비어있을 수 없습니다
echo isValidUsername("admin"); // 사용자 이름을 예약 할 수 없습니다
echo isValidUsername("guest"); // 유효한 사용자 이름
?>
이 예는 빈 판단을 STRCMP 와 우아하게 결합하여 판단을 내리는 방법을 보여줍니다.
strcmp를 사용하여 문자열을 비교할 때, 빈 문자열이 관련된 경우, 함수 자체는 오류를보고하지 않지만 비즈니스 로직이 올바른 것은 아닙니다. 제안 된 관행 :
먼저 빈 문자인지 여부를 결정한 다음 비교하십시오.
Trim ()을 사용하여 불필요한 공백을 지우십시오.
느슨한 비교를 사용하여 발생하는 유형 변환 문제를 피하십시오 ( == ).
문자열 비교의 컨텍스트가 명확하고 사전 순서입니까? 동일합니까? 사례에 민감합니까?
이러한 방법을 통해 문자열 비교 로직이 더욱 엄격하며 많은 숨겨진 버그를 피할 수 있습니다. 사용자 입력 처리, URL 매개 변수, 구성 값 등과 같은 시나리오에서 STRCMP가 발생하면 이러한 기술을 사용하여 코드 견고성을 향상시킬 수 있습니다.
참조 링크
PHP 공식 문서 : <code> https://gitbox.net/manual/en/function.strcmp.php </code>