5

したがって、php サイトには、さまざまな値を比較した結果を示す次のページがあります。

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

これは参考になりますが、型比較を正しく行っているかどうかを確認するたびに、このページにアクセスする必要はありません。だから私の質問は

PHP での型比較のロジックの背後には、何らかの根本的な哲学/推論がありますか?

たとえば、大まかな比較では次のようになります。

  • 1、-1、"1" および "-1" は TRUE として処理でき、0 および "0" は FALSE として処理できます。
  • 数値の文字列値を数値自体と比較すると、yield TRUE;

しかし、パターンを確立しようとすると、少し毛むくじゃらになります。

4

7 に答える 7

6

ブール値に直接キャストする場合、これがどのように機能するかです。

  • 長さ > 0 のすべての文字列は真です
  • 0 以外の数値はすべて true
  • 空でないすべての配列は真です
  • すべてのオブジェクトは真です

次に、同じ型の変数を比較するためのこれらの規則:

  1. プロパティが等しい場合、オブジェクトは同等です
  2. キーと要素が等しい場合、配列は同等です
  3. 同じ出力を生成する場合、文字列は同等です
  4. 数値が数学的に同等である場合、数値は同等です
  5. ブール値は、値が同じであれば等価です。

異なるタイプの変数の場合、上記のリストで上位のタイプが下位のタイプにキャストされ、比較が行われます。

===and演算子は比較前にキャストしませんが、オブジェクトが同じインスタンスである場合に!==のみキャストされることに注意してください。===

本当に奇妙なのは配列です===。同じキーと値が同じ順序で定義されている場合です。

$a = array("a"=>1, "b"=>2);
$b = array("b"=>2, "a"=>1);

$a == $b; // true
$a === $b; // false

empty()同等です!(bool)$var

例外

  • 配列を文字列にキャストすると、通知がトリガーされ、役に立たないテキストとしてキャストされますArray
  • メソッドのないオブジェクトを __toString文字列にキャストすると、致命的なエラーが発生します。
  • オブジェクトは暗黙的に配列にキャストされないため、オブジェクトを配列と比較するたびに false が返されます (オブジェクトがインターフェイスを実装している場合でも、これが true であることをUPDATEArrayAccessが確認しました) 。
于 2013-05-14T22:00:46.737 に答える
2

非常に簡単なガイドラインと仕様のバグがあり、混乱を招く可能性があります。

厳密な比較では、データ型と値が等しいかどうかがチェックされます。緩やかな比較では、値のみが等しいかどうかがチェックされます。

オブジェクト (比較表の一部ではない) の場合、PHP は非常に単純です。オブジェクトが他のインスタンスと同じインスタンスである場合、厳密に等しいか、そうでない場合は緩やかに等しいかを判断します。

したがって、0 と "0" は大まかに互いに等しく、false (および任意の文字列) に等しくなります。後者は、すべての文字列が数値ではないため、false であり、false に等しい数値は 0 であるため、すべての文字列は 0 に等しいと理解できます。

null と array() の比較はより複雑です。array() で作成された配列をチェックして、それを大まかに厳密に比較すると、true が返されます。ただし、is_null でチェックすると、false が返されます。array() で作成された array() は null である '' と等しくないため、後者の方がより論理的だと思います。関数 is_null() とチェック == null または === null の間のこの機能的な不一致はバグだと思います。値をチェックするために 2 つの異なる有効なメソッドを使用して異なる結果が返されることは起こらないはずだからです。Null は、関数 is_array() によると配列でもありません。これは true です。空の配列は、関数 is_array() による配列であり、これも真である必要があります。したがって、null が array() と等しいということは絶対にあってはなりません。

于 2013-05-16T14:37:02.330 に答える
2

に何かが含まれている場合、それは であると言えますtrue。たとえば、、、1など1.123array("value")すべて として扱われtrueます。

値が空または無効(つまり、何かが欠けている)であると言える場合、それは と見なされfalseます。たとえば、00.0array()などです。

変数に関するこの考え方は、PHP に特有のものではありません。他の多くの言語は、同じまたは類似の方法でそれを行います。たとえば、ほんの数例を挙げると、Perl、C、および Javascript です。

于 2013-04-16T22:35:55.387 に答える
1

特定のロジックはありませんが、いくつかのパターンを把握できます。

  • 「空の」値 ( nullfalse0、空の文字列および文字列'0') は次のように評価されます。false
  • 数値の比較は、あるバージョンまで暗黙のうちに整数に変換されます (実際には異なる 2 つの長い数値文字列が等しいと見なされるバグがありましたが、現在は修正されています)。
  • strict配列を操作する場合、明示的なパラメーターで array_key_exists を呼び出す場合を除いて、整数インデックスと数値インデックスに違いはありません
  • 数値と文字列を比較すると、暗黙的に右の引数が左の引数の型に変換されます
  • return ($something);$somethingスカラーでない場合、暗黙的に文字列に変換します
于 2013-05-15T20:31:09.820 に答える
1

基本パターンは C で使用されているものと同じです。ブール値の比較のために、0 以外はすべて true です。

この意味で、空の文字列または配列も false です。

注意すべき毛むくじゃらのスカラーは'0'で、これも (非常に不便なことに) 整数に変換されるため、空として扱われます。array(0)アレイの前面と同じように厄介です。

厳密な比較 (===および!==) を使用すると、物事はより正気になります。実際には、スーパーグローバルとデータベースからの入力を適切にキャストし、その時点からこれらの演算子を使用することをお勧めします。

于 2013-05-16T21:13:16.400 に答える
0

私は次のように見ています。

  1. PHP は Web プログラミング言語として設計されており、ページのすべての入力は文字列に基づいています [人間のような認識] [ちなみにこれは JavaScript にも当てはまります]
  2. したがって、数字のように見えるすべての文字列(is_numeric() 関数) は、暫定的に数字のように振る舞います [比較、キャスト]。
  3. これは、 「0」のような極端なケースが最初に(int)0にキャストされ、次にfalseにキャストされると暗黙的に考えられる理由を説明しています。
于 2013-05-17T14:24:44.607 に答える