80

重複の可能性:
php == vs === 演算子

私が確信している誰かのための簡単な答え。この式が true と評価される理由を誰か説明できますか?

(1234 == '1234 test')
4

6 に答える 6

96

== (類似度) 演算子を使用していて、PHP が文字列を int に変換しているためです。

これを解決するには、=== (等価) 演算子を使用します。これは、値が同じかどうかだけでなく、データ型も同じかどうかもチェックするため、"123" 文字列と 123 int は等しいとは見なされません。

于 2012-08-28T02:26:10.277 に答える
78

PHP (および JavaScript -- 動作はわずかに異なります) では、比較演算子の==動作が、C や Java などの厳密に型指定された言語とは異なります。===オペレーターは、おそらく予想どおりの動作をします。以下は、PHP に適用される 2 つの比較演算子の内訳です。

==

この演算子は公式には「等価」演算子として知られていますが、「等価」という言葉の通常の定義には実際には適合しません。これは、型ジャグリング比較として知られていることを行います。両方のオペランドの型が一致しない場合 (あなたの例で1234は、整数で1234 test文字列でした)、PHP は暗黙的にオペランドを互いの型にキャストし、以下に示すように新しく型付けされた値の等価性をテストします。

<?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に変数$aandがあるとします。$b

<?php
class A { 
  public $property = 'default value';
}
$a = new A();
$b = new A();

var_dump($a === $b);を出力することを期待するかもしれませんbool(true)。実際には false が返されます。オブジェクトに対して使用すると、演算子は両方のオペランドが同じオブジェクトへの参照であるかどうかを実際にチェックします。この==場合、オペレーターはオブジェクトのプロパティをチェックすることで機能します$a == $b

PHP マニュアル リンク

于 2012-08-28T02:59:02.353 に答える
28

文字列を整数にキャストすると、数字以外の最初の文字までの数字が数字になります。したがって、スペースは数字ではないために'1234 test'なります。1234

したがって1234 == '1234 test'

文字列比較を強制したい場合は、文字列にキャストする必要があります。

''.(1234) == '1234 test' // implicit
(string) 1234 == '1234 test' // explicit
strval(1234) == '1234 test' // procedural
于 2012-08-28T02:26:31.417 に答える
8

2 つの異なるタイプのデータ (整数と文字列) を大まかに比較しています。PHP には、緩い比較二項演算子 (==) を使用した場合にシステムで比較がどのように機能するかについての非常に詳細なチャートがあります。

http://php.net/manual/en/types.comparisons.php

型が同期していること、つまり両方が整数または両方が文字列であることを確認する場合は、強力な型比較演算子 (===) を使用します。

この演算子を使用すると、これも false を返すことに注意してください。

1234 === '1234'

比較するときに型がわからない場合は、強力な型比較を PHP の型キャストと組み合わせることができます。

$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
于 2012-08-28T04:50:02.490 に答える
4

double equals は、文字列から int を解析するように php に指示します。文字列は整数 1234 に評価されます。正確な比較を行うには、3 つの等号 '===' を使用します。

于 2012-08-28T02:26:41.507 に答える
3

数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。

var_dump(0 == "a"); // 0 == 0 -> true
于 2012-08-28T02:29:14.827 に答える