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