ホームページ  >  記事  >  バックエンド開発  >  PHPの比較演算子を導入するという考え方と従来の比較手法の違いは何でしょうか?

PHPの比較演算子を導入するという考え方と従来の比較手法の違いは何でしょうか?

伊谢尔伦
伊谢尔伦オリジナル
2017-06-21 11:13:461239ブラウズ

PHP の 比較演算子 は少し奇妙で間違いやすいです。比較ルールは次のとおりです:

1. 2 つの文字のサイズを比較する場合、2 つの文字の ASCII コード サイズを比較するのは簡単です。理解すること。

2. 2 つの文字列のサイズを比較する場合、最初の文字から開始して、対応する特定の位置から開始する限り、一方の文字列の現在位置の文字が他方の文字列よりも大きくなります。つまり、2 つの文字列のサイズは、「ba」>「az」のように直接決定できます。これは誰もが知っています。

次に、「10」と「a」を比較します。もちろん、それは同じです。まず、「1」と「a」のASCIIコードを比較すると、「a」の方が大きいです。

3. 数値を文字列/文字と比較する場合、システムはまず文字列/文字を整数/浮動小数点型に変換しようとし、次にそれを比較します。たとえば、「12bsd」は 12, ' に変換されます。 a ' 0 に変換されますが、この時点では、対応する ASCII コード値は数値と比較されないことに注意してください。

実際、同じ理由が当てはまり、「a」+10 の結果も 10 になります。

そして無視しやすいのは、0 を数値に変換できない文字列 (演算子は ==) と比較すると、どちらも true を返すということです。

最終的には以下のような結果が現れます:

var_dump(&#39;1000000&#39;<&#39;a&#39;);    //result: boolean true
var_dump(&#39;a&#39;<1);            //result: boolean true
var_dump(1<&#39;1000000&#39;);      //result: boolean true

従来の考え方とは少し違います。 。

2 つの文字列が等しいかどうかを比較する最も一般的な方法は、「===」を使用して判断することです。「==」との違いは、簡単に言えば、前者は「同一」の要件が同じであることを強調しています。 type; 後者は「等しい」が必要で、値は同じです。または、strcmp を使用して判断しますが、これは 2 つの文字列が等しいかどうかはわかりますが、どこが違うのかはわかりません。

一般に、2 つのオブジェクトが等しいかどうかを比較するには、!=、== を使用できます。これらが 2 つのオブジェクトである理由は、必ずしもすべてが文字列である必要はなく、整数などの場合もあります。
比較に !==,=== (追加の等号が表示されます) を使用する場合、true を返すには 2 つのオブジェクトの型が厳密に等しい必要があります。それ以外の場合は ==,!= を使用すると、文字列は次のようになります。比較のために対応する型に自動的に変換されます

22 == "22"; // true を返します 22 === "22"; // このため、プログラムでは予期しないことがよく発生します。 Unexpected":

0 == "I love you"; // Return true

1 == "1 I love you"; // Return true

PHP チュートリアルにもこのような文字列比較のセットがあります。 strcmp、strcasecmp、
strncasecmp

()、strncmp() は、前者が後者より大きい場合は 0 より大きい整数を返し、前者が後者より小さい場合は 0 より小さい整数を返します。それらが等しい場合、0 が返されます。それらの比較の原則は他の言語の規則と同じです。

strcmp は、大文字と小文字を区別する (つまり、大文字と小文字を区別する) 文字列比較に使用されます: echo strcmp("abcdd", "abcde") // "b" と "b" を比較して 1 (>0) を返します

;

strcasecmp は、大文字と小文字を区別しない文字列比較に使用されます:
echo strcasecmp("abcdd", "abcde"); // "d" と "e を比較して、-1 (

strncmp は比較に使用されます。文字列の先頭から始まる文字列の一部。 3 番目のパラメータは比較する長さです。
echo strncmp("abcdd", "abcde", 3); // 1 (>0) を返し、abc を比較します。 abc

strncasecmp は、大文字と小文字を区別せずに文字列の先頭から開始して文字列の一部を比較するために使用されます。 3 番目のパラメーターは比較する長さです:
echo strncasecmp( "abcdd", "abcde", 3); // abc と abc を比較すると、大文字と小文字が区別されず、同じであるため、0 を返します。

もう 1 つの状況は、文字列のサイズを単純に比較するだけでは、あらかじめ決められたニーズを満たすことができないということです。たとえば、通常 10.gif は 5.gif よりも大きくなりますが、上記の関数を適用すると、-1 が返され、これは 10 を意味します。この状況では、gif の方が 5.gif よりも優れています。PHP には、2 つの自然な対照的な関数 strnatcmp
strnatcasecmp

:

echo strnatcmp("10.gif", "5.gif"); // Return 1 (>0) が用意されています。 )echo strnatcasecmp("10.gif", "5.gif"); // 1 (>0) を返します

PHP では == の使用は信頼できません。変数の型が同じであっても、 == が真であるということは、それらが本当に等しいことを意味するわけではありません。したがって、PHP での比較には === を使用してください。== を使用する前によく考えてください。 PHP の === の演算は ZEND_IS_IDENTICAL です。PHP は値の型を変更しようとしません。これは非常に厳密であり、比較速度が速くなります。例:

$aa = &#39;88.&#39;;//多个点
$b = &#39;88&#39;;
if($aa == $b) 
echo "相等";

得到的结果是相等。因为88是一个数字,php会自动转换成整型或者浮点型进行==比较,当然会相等; strcmp是强制转换成string类型比较,===是要求数值一样并且类型一样 88是int类型,88.是浮点类型,当然不一样。用恒等 === 则 不会得到相等的结论.用strcmp()也不会得到相等的结论.所以最好不要使用 == 作为字符串相等比较.改用strcmp();

       对于俩个字符串, 会首先判断他们是否是numeric_string, 如果是,那么就会转换成整形来比较.. 那么什么是numeric string呢? 因为PHP不区分类型, 所以它采用一个策略, 当你的变量看起来是一个数字的时候, 那么她就认为这个变量是一个数字,然后转换为整形来比较。

以上がPHPの比較演算子を導入するという考え方と従来の比較手法の違いは何でしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。