==(類似性)演算子を使用していて、PHPは文字列をintに強制変換しているためです。
これを解決するには、===(equality)演算子を使用します。この演算子は、値が同じかどうかだけでなく、データ型も同じかどうかをチェックするため、「123」文字列と123intは等しいとは見なされません。
PHP(およびJavaScript-動作が少し異なります)では、比較演算子_==
_は、CやJavaなどの強く型付けされた言語とは動作が異なります。_===
_演算子には、予想通りの動作があります。以下は、PHPに適用される2つの比較演算子の内訳です。
この演算子は正式には「等価」演算子として知られていますが、Wordの「等価」の通常の定義には実際には適合しません。 型ジャグリング比較として知られていることを行います。両方のオペランドのタイプが一致しない場合(この例では、_1234
_は整数で、_1234 test
_は文字列でした)、PHP willimplicitlyオペランドを互いの型にキャストし、以下に示すように、新しく型付けされた値の同等性をテストします。
_<?php
var_dump( (int) 'hi' ); // int(0)
var_dump( (string) 0 ); //string("0")
var_dump( 'hi' == 0 ); // bool(true)
var_dump( (int) '1hi' ); // int(1)
var_dump( 1 == '1hi' ); // bool(true)
_
これには、対応する(型ジャグリング)不等式演算子_!=
_があります。
「同一」演算子として知られる_===
_演算子は、両方のオペランドの値およびタイプの厳密なチェックを実行し、実行しません。暗黙のキャスト。したがって、_"0"
_は_=== 0
_を実行せず、_"1234 test"
_は_=== 1234
_を実行しません。
_<?php
var_dump( '1234 test' === 1234 ); // bool(false)
_
これには、対応する(厳密な)不等式演算子_!==
_があります。
_===
_演算子は、一部の人にとって奇妙と見なされるオブジェクトに対する動作を持っていることに注意してください。以下に定義するように、_class A
_と変数_$a
_および_$b
_があるとします。
_<?php
class A {
public $property = 'default value';
}
$a = new A();
$b = new A();
_
var_dump($a === $b);
がbool(true)
を出力することを期待するかもしれません。実際にはfalseを返します。オブジェクトに対して使用される場合、演算子は実際に両方のオペランドが同じオブジェクトへの参照であるかどうかをチェックします。この場合、_==
_演算子は、オブジェクトのプロパティをチェックすることによって機能するため、_$a == $b
_です。
文字列を整数にキャストする場合、最初の非数字までの数字が数字になります。したがって、スペースは数字ではないため、'1234 test'
は1234
になります。
したがって、1234 == '1234 test'
文字列比較を強制したい場合は、文字列にキャストする必要があります。
''.(1234) == '1234 test' // implicit
(string) 1234 == '1234 test' // explicit
strval(1234) == '1234 test' // procedural
2つの異なるタイプのデータ(整数と文字列)を大まかに比較しています。 PHPには、緩い比較二項演算子(==)を使用した場合にシステムで比較がどのように機能するかについての非常に詳細なチャートがあります。
http://php.net/manual/en/types.comparisons.php
型も同期していること、つまり両方が整数または両方の文字列であることを確認する場合は、厳密な型比較演算子(===)を使用します。
この演算子を使用すると、これもfalseを返すことに注意してください。
1234 === '1234'
比較するときに型がわからない場合は、強い型の比較をPHP typecastingと組み合わせることができます。
$a = 1234;
$b = '1234';
if ($a === $b) { } // Will not fire, as it is false
if ((int)$a === (int)$b) { } // Will fire, as it is true
Double equalsは、文字列からintを解析するようにphpに指示します。文字列は整数1234に評価されます。正確な比較を行うには、トリプルイコール '==='を使用してください。
数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、比較は数値的に実行されます
var_dump(0 == "a"); // 0 == 0 -> true