より深く入る前に、 STRCMPの基本的な使用法を見てみましょう。
<?php
$result = strcmp("apple", "banana");
echo $result; // 出力の負の数,なぜなら "apple" 未満 "banana"
?>
STRCMPの返品値の意味は次のとおりです。
0未満:最初の文字列は2番目の文字列未満です
0に等しい:2つの文字列が等しい
0より大きい:最初の文字列は2番目の文字列よりも大きい
たとえば、空の文字列がある場合:
<?php
$str1 = "";
$str2 = "banana";
$result = strcmp($str1, $str2);
echo $result; // 出力の負の数
?>
結果は依然として否定的です。これは、 STRCMPが空の文字列を正しく処理し、エラーを報告しないことを示しています。しかし、問題は -そのような比較を期待していますか?
多くのプログラマーがSTRCMPを使用している場合、実際の意図は、2つの「空の非」文字列が同じかどうかを判断することです。そのうちの1つが空である場合、ビジネスロジックに何か問題があることを意味する場合があります。たとえば、ユーザーがユーザー名を空に送信し、もう1つがデータベース内の既存のユーザー名である場合、ユーザー名が最初に空であるかどうかを確認する必要がありますか?
<?php
if ($str1 === "" || $str2 === "") {
echo "少なくとも1つの文字列が空です,比較できません。";
} else {
if (strcmp($str1, $str2) === 0) {
echo "2つの文字列は同じです";
} else {
echo "2つの文字列は異なります";
}
}
?>
これにより、論理エラーを回避できます。 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>