PHP - BASIC - 6. PHPの分岐構造 - 5. 異なるデータ型の比較
こでまでに学習してきたようにPHPのデータ型には整数型( int
型)、実数型( float
型)、論理型( bool
型)、文字列型( string
型)など様々なものが用意されています。ここでは異なる型のデータを比較するとどうなるか学習していきましょう。まずは次のプログラム( choice7.php
)を作成します。
<?php
$diceA = 6;
$diceB = "6";
if ($diceA == $diceB) {
echo "Win";
} else {
echo "Lose";
}
このプログラムでは変数 $diceA
と $diceB
に同じ 6
というデータが代入されています。しかしデータについてよく見ると変数 $diceA
には整数型( int
型)の 6
が代入されており、変数 $diceB
には文字列型( string
型)の "6"
が代入されているのがわかります。
文字列型のデータはダブルクォーテーション
"
やシングルクォーテーション'
で囲みます。
このようなデータ型の異なる2つの値を ==
演算子で比較すると評価結果は true
となるのでしょうか、それとも false
となるのでしょうか。実際にプログラムを実行して確かめてみましょう。
$ php choice7.php
Win
実行結果には Win
と表示されていることから、変数 $diceA
に代入されている整数の 6
と変数 $diceB
に代入されている文字列の "6"
は等しい、と評価されていることがわかります。PHPの ==
演算子は、異なるデータ型の値を比較する際には、その内部でデータ型を統一してから比較するようになっています。具体的には整数型のデータと文字列型のデータを比較するときには、文字列型のデータ(この場合 $diceB
の "6"
)を整数型のデータ( 6
)に変換してから比較します。そのため2つのデータは等しいと評価されるわけです。
開発現場においてこのような ==
演算子によるデータ型の自動変換は望ましい結果を生むケースもあれば、そうでないケースもあるでしょう。今回のようにデータ型が異なる2つのデータを比較する場合は、評価結果が false
になってほしいというケースもあるでしょう。PHPではそのような場合を考慮して ===
演算子が用意されています。
===
演算子は ==
演算子と同じように2つのデータが等しいかどうかを判定するために利用しますが、2つのデータが異なるデータ型の場合は、その時点で評価結果に false
を返すようになっています。さきほどのプログラム( choice7.php
)において、 ==
演算子による比較から ===
演算子による比較に変更してみましょう。
<?php
$diceA = 6;
$diceB = "6";
if ($diceA === $diceB) {
echo "Win";
} else {
echo "Lose";
}
if文の条件式が $diceA === $diceB
となっている点を確認してください。今回$diceAには整数型の6、$diceBには文字列型の"6"が代入されているため、条件式の評価結果は false
となります。それではプログラムを実行してみましょう。
$ php choice7.php
Lose
実行結果には Lose
と表示されていることから、変数 $diceA
に代入されている整数の 6
と変数 $diceB
に代入されている文字列の "6"
は等しくない、と評価されていることがわかります。このように ==
演算子による比較と ===
演算子による比較は異なるデータ型の値を比較する際の評価方法が異なります。
データ型の変換(キャスト)
次に文字列型のデータを整数型のデータに変換したり、あるいはその反対に文字列型のデータを整数型のデータに変換する方法を見ていきましょう。このようなデータ型の変換をキャストと呼ぶこともあります。次のプログラム( choice8.php
)を作成します。
<?php
$diceA = 6;
$diceB = "6";
$diceC = (int)$diceB;
if ($diceA === $diceC) {
echo "Win";
} else {
echo "Lose";
}
このプログラムでは変数 $diceA
と $diceB
にそれぞれ整数型の 6
と文字列型の "6"
を代入しています。このとき変数 $diceB
には文字列型の "6"
が代入されていますが、次のようにプログラミングすることで文字列型のデータを整数型データに変換できます。
$diceC = (int)$diceB;
ここでは変数 $diceB
の直前に変更後のデータ型 (int)
を記述しています。このように記述すると文字列型のデータを整数型データに変換できます。このプログラムでは変数 $diceC
には整数型の 6
が代入されます。それではプログラムを実行してみましょう。
$ php choice8.php
Win
実行結果から if
文の条件式である $diceA === $diceC
の評価結果は true
となっていることがわかります。ここでは ===
演算子で評価しているので変数 $diceA
と$ diceC
には同じデータ型( int
型)の値 6
が代入されていることがわかります。
まとめ
==
演算子は型の相互変換が発生する===
演算子は型の相互変換が発生しない(int)
のように記述することでデータ型を変換できる(キャスト)