0

データベースの値に対してフォームの入力をテストします。ファックス番号と電話番号に関しては、文字列の比較は失敗します。

$fax = trim($args['fax']);
$oldFax = trim($address->getFax());
if($fax != $oldFax){
  $address->setFax($fax);
  $address->flagChanged('fax');
}

上記のテストでは、「+494321」と「00494321」を比較すると一致が見つかります。何故ですか?代わりに !== を使用してテストすると、期待どおりに動作します。

4

5 に答える 5

2

値と型を!==比較し、文字列を暗黙的に整数に変換するためです。!=

于 2013-04-23T07:55:18.680 に答える
1

リンクを1つ教えてください:

http://php.net/manual/en/language.operators.comparison.php

数値文字列を比較する場合、各文字列は先頭のゼロと記号をすべて省略した数値に変換されます (比較は数値的に実行されます)

于 2013-04-23T07:57:41.950 に答える
1

これは、文字列を数値として使用できることを意味する型ジャグリングが原因であり、「緩やかに等しい」比較演算子を使用しているためです。 ==

式のオペランドが数値(つまり、数字を含み、数値と見なすことができる)の場合、比較される前に適切な数値型 (integerまたは) に変換されます。floatしたがって、これは PHP が実際に次の式を認識する方法です。

("+494321" == "00494321") => (494321 == 494321)

最初のオペランドではプラス記号が削除され (数値が正であることを意味するだけです)、2 番目のオペランドではゼロが切り捨てられます (これらは実際には何の意味もありません。つまり07、 と7は両方とも同じ 10 進数であり、表現が少し異なるだけです)。

2 つの文字列を正確に比較するには、いくつかの方法があります。1 つ目は、単純に「正確に等しい」演算子を使用すること===です。この演算子を使用すると、オペランドの型がジャグリングされることはありません。つまり、比較演算子の両側が完全に一致します。文字列は文字列になり、整数は整数になります。

例として、これら 2 つの式は両方とも と等しくなりfalseます。

"123" === 123
"006" === 6

もう 1 つの方法は、strcmp関数 (または同様の関連関数) を使用することです。文字列をバイトごとに比較します。

$a = "+494321";
$b = "00494321";
if (strcmp($a, $b) === 0) {
    echo "The same";
} else {
    echo "Not the same";
}

この関数は0、2 つの文字列に違いがない (つまり、違いがない) 場合に戻ります。返された数値がそれより小さいか大きい場合0、2 つの文字列は同じではありません。

于 2013-04-23T08:19:19.327 に答える
0

なぜなら

=== and !== 

厳密なマッチングを行います。一方

== and !=

ではない。

于 2013-04-23T07:54:48.243 に答える
0

可能な限り常に厳密な比較を行います。

==たとえば、!=あなたの場合、両方が数字のように見えるため、PHPは文字列を数値的に比較します(=それらを整数に変換して比較しようとします)。

マニュアルのより奇妙な例: http://php.net/manual/en/language.operators.comparison.php

于 2013-04-23T07:56:17.323 に答える