PHPの比較についての覚書。
PHPの比較演算子は値のみを比較す等値演算子(==, !=)、型と値を比較する同値演算子(===,!==)の2つがある。
比較演算子を表にまとめる。
演算子 | 種類 | <>意味 |
---|---|---|
== | 等値 | 値が等しい |
!=(<>) | 等値 | 値が等しくない |
=== | 同値 | 型も値も等しい |
!== | 同値 | 型も値も等しくない |
異なる型を等値演算子で比較する場合はPHPが同じ型に(暗黙で)自動変換して値を比較する。変換規則は以下のとおりである。
数値と文字列の比較は文字列を数字に変換して数字同士を比較する。
論理値と数値の比較は数値の0以外(負数も含む)をTUREに変換して0をFALSEへ変換する[1]。
“0”と空文字””はFALSEへ変換する。それ以外はTRUEへ変換する。
$a = 100; $b = “100”; => “100”が数字100へ変換されTRUE
$a = “”; $b = “0” => 文字列と文字列の比較のためFALSE
$a = “”; $b = 0; => 数字と文字列の比較のため””は0へ変換されTRUE
型は自動変換されず、値も型も等しい場合にTRUE。
つまり$a = 100; $b = “100”; => $a===$bは型が異なるためFALSEとなる。
“” | “0” | 0 | NULL | 未定義 | array() | |
“” | TRUE | FALSE | TRUE | TRUE | TRUE | FALSE |
“0” | FALSE | TRUE | TRUE | FALSE | FALSE | FALSE |
0 | TRUE | TRUE | TRUE | TRUE | TRUE | FALSE |
NULL | TRUE | FALSE | TRUE | TRUE | TRUE | TRUE |
未定義 | TRUE | FALSE | TRUE | TRUE | TRUE | TRUE |
array() | FALSE | FALSE | FALSE | TRUE | TRUE | TRUE |
■注意すべき同値(===)演算子
“” | “0” | 0 | NULL | 未定義 | array() | |
“” | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
“0” | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
0 | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
NULL | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE |
未定義 | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE |
array() | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE |
» http://php.benscom.com/manual/ja/types.comparisons.php
型はgettype関数で取得できる。たとえばかきのようにフォームに設定した値は文字列(string)となる。
<select name="year"> for ($y=2011; $y<2020; $y++) { echo '<option value="' . $year . '" selected="selected">' . $year. '</option>'; } </select>
$year = $_POST['year'] print(gettype($year)); // --- string
追記 2011.06.29 gettypeは推奨されていない。代わりに下記の関数で型を調べる。
is_array() - 変数が配列かどうかを検査する
is_bool() - 変数が boolean であるかを調べる is_float() - 変数の型が float かどうか調べる is_int() - 変数が整数型かどうかを検査する is_null() - 変数が NULL かどうか調べる is_numeric() - 変数が数字または数値形式の文字列であるかを調べる is_object() - 変数がオブジェクトかどうかを検査する is_resource() - 変数がリソースかどうかを調べる is_scalar() - 変数がスカラかどうかを調べる is_string() - 変数の型が文字列かどうかを調べる
» http://php.net/manual/ja/function.gettype.php
[1] javascriptとは異なる。Javascriptの場合はTRUEが1へFALSEが0へ変換され数字同士の比較となる。
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。