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)のように記述することでデータ型を変換できる(キャスト)