web-dev-qa-db-ja.com

1234 == '1234 test'がtrueと評価されるのはなぜですか?

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

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

(1234 == '1234 test')
80
Cjueden

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

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

95
Lucas Green

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_です。

PHPマニュアルリンク

77
Lusitanian

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

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

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

''.(1234) == '1234 test' // implicit
(string) 1234 == '1234 test' // explicit
strval(1234) == '1234 test' // procedural
28

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
8
Andrew Vaughan

Double equalsは、文字列からintを解析するようにphpに指示します。文字列は整数1234に評価されます。正確な比較を行うには、トリプルイコール '==='を使用してください。

4
Ray

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

var_dump(0 == "a"); // 0 == 0 -> true
3
amitchhajer