//PHPの変数比較
PHPの変数比較
PHPでの比較演算子を理解していますか? ここでは、PHPの比較演算子とその動作について詳しく説明します。特にPHP 5.6を使用している場合に注意すべき点を紹介します。
1. PHPの比較演算子
PHPでは、「==」と「===」という2種類の比較演算子があります。これらの違いを理解することが非常に重要です。
「==」(Loose Comparison)
「==」は、両方のオペランドを比較する前に型を自動的に変換します。つまり、型が異なっていても、PHPが自動的に型を変換して比較します。
「===」(Strict Comparison)
「===」は型を厳密に比較します。型が異なる場合、比較はfalseを返します。
2. PHPの値の型
PHPでは、以下のようなデータ型があります。
- String
- Integer (または Long)
- Float (または Double)
- Boolean
- Array
- Object
- NULL
- Resource
3. Falsy値とTruthy値
PHPで「false」と見なされる値には、以下のものがあります:
false
0
0.0
""
(空文字列)"0"
[]
(空配列)null
(未設定の変数)SimpleXMLオブジェクト
(空タグから作成されたもの)
上記の値以外の値はすべて「true」と見なされます。
4. PHPの比較ルール
PHPでは、比較演算を行う際にいくつかの特別なルールがあります。例えば、文字列同士の比較や、数値と文字列の比較では予期しない結果が出ることがあります。
Null vs String
null
は空文字列として扱われます。
null == ""; // true
null == "0"; // false
Boolean & Null
BooleanやNullと比較する場合、PHPはこれらをBoolean型にキャストして比較します。
NAN == true; // true
null < NAN; // true
"0" < true; // true
String vs String
文字列同士の比較では、PHPは時々文字列を数値型や浮動小数点型にキャストして比較します。
"100" == "10e1"; // true
"16" == "0x10"; // true
Number vs String
文字列が数値として解釈できる場合、それは数値にキャストされて比較されます。
0 == "thang"; // true
345 == "345 thang"; // true
100 == "10e1thang"; // true
Array vs Array
2つの配列は、キーと値が一致すれば「==」で等しいと見なされます。
$array1 = ['3' => 3, '2' => 2, '1' => 1, '0' => 0];
$array2 = [false => '0', 1 => '1', 2 => '2', 3 => '3'];
$array1 == $array2; // true
$array1 === $array2; // false
Object vs Object
異なるクラスのインスタンスは比較できませんが、同じクラスのインスタンスで、属性の値が同じであれば、「==」で比較すると等しいと見なされます。さらに、「===」では、同一のインスタンスを指している場合のみ等しいと見なされます。
class C {
public $c;
public function __construct($c) {
$this->c = $c;
}
}
$a = new C("1");
$b = new C(1);
$a == $b; // true
$a === $b; // false
$a = $b = new C(1);
$a === $b; // true
5. その他の特殊な比較
- 配列は、他のすべての型(boolean, array, objectではない)と比較すると、常に「true」と見なされます。
- 空の配列は数値にキャストされると「0」となります。
- オブジェクトは配列よりも大きいと見なされます。
[0] > 100; // true
[1] > "thang"; // true
(int) [null] == 1; // true
(float) [] == 0; // true
new stdClass > [1]; // true
6. 面白い事実
- PHPの「==」は反射的(reflexive)ではないため、
NAN == NAN
は「false」を返します。 - PHPの「==」は対称的(symmetric)であり、
$a == $b
と$b == $a
は同じ結果を返します。 - PHPの「==」は推移的(transitive)ではないため、
$a == $b
と$b == $c
が「true」を返しても、$a == $c
は「true」を返さない場合があります。
1 == true; // true
2 == true; // true
1 == 2; // false