【On to PHP】データ型の変換

こんにちは、さるまりんです。

PHPにどんなデータにはどんな種類があるのかはこちらでまとめてみました。

PHPはデータに型はあるにしろ、それが比較的ゆるいです。

Javaなど他の型にゆるくない言語ではこの変数は整数と宣言したら整数を持ちますし、文字列と宣言したら文字列といった具合ですが、PHPではある変数を用意して、文字列を持たせていても、プログラムの実行が進むにつれて同じ変数に数値を持たせたりすることができます。

変数はデータを入れる箱のようなものなので、そこになんでも入れられる感じかなと思っています。

ゆるいという意味ではデータの意味的な側面もあります。

123と456

これらは数値でしょうか?

そうですよね。みたままなら数値です。二つの値を足すと579になりますね。

コードでやってみるとこんな感じです。

$num1 = 123;
$num2 = 456;
$result = $num1 + $num2;
print $result; // 579と出力されます

それでは文字列として考えてみてはどうでしょう?

文字列を足すというのは連結することとすると、”123″と”456″を足すと”123456″になります。

コードでやってみるとこんな感じです。

$str1 = '123';
$str2 = '456';
$result = $str1 . $str2;
print $result; // 123456と出力されます

3行目の「.」は前の後ろの文字列を連結します。まだOnto PHPでは触れていませんがこのように何かしらの計算(演算)を行う記号のことを演算子と言います。ここでいう計算とは文字同士の連結という処理のことです。

暗黙の変換

上はどちらも数値、もしくは文字列でした。これが片方は数値、片方は文字列だったらどうでしょうか?

$var1 = 123;
$var2 = '456';
print $var1 + $var2;
print $var1 . $var2;

上のコードでは

1〜2行目で数値と文字列の変数を用意

3〜4行目では、加算、もしくは連結してその結果を出力します。何が表示されるでしょう?

PHPはこのような時、その文脈に応じて自動的に型を変換して、何かしらの処理しようとします。この時に起こる変換が暗黙の変換です。

上のコードでは3行目は+を使って加算しようとしています。ということは両方を数値として扱いますので$var2が持つ456は文字列ではなく数値に変換されて、結果「579」と出力されます。

4行目では.を使って連結しようとしています。ということは両方を文字列として扱いますので$var1が持つ123は数値ではなく文字列として扱われ、結果「123456」と出力されます。

文字列から数値へ、数値から文字列へ。状況に応じて変換。

便利ですよね〜。

でもこの変換は思わぬところでつまずく原因になることもありますので注意する必要があります。

論理値への変換

よく使われる暗黙的に型変換には数値と文字列の変換以外には論理値との変換があります。

空文字列「''」、ゼロの数値(00.0)は論理値のfalseに、空文字列以外の文字列、ゼロ以外の数値はtrueとして扱われます。Onto PHPではまだ触れていませんがデータの集まりを扱うための配列という仕組みがあるのですが、この集まりが空の状態をfalse、それ以外はtrueと扱うというのもあります。データの種類のところで書いた「みなす」というのがこれです。

このそれぞれから論理値への変換がもっとも利用されるんじゃないかな。どんなところで使われるかはまたOnto PHPで触れていきます。

明示的な変換

暗黙の変換のところで書いたように思わぬつまずきにならないようにするには強制的に変換します。この明示的な変換をキャストするとも言います。

キャストは次のように記述します。

(データの型) 値

データの型は

  • 整数 (int) (integer)
  • 浮動小数点数、実数 (float) (double) (real)
  • 論理値 (bool) (boolean)
  • 文字列 (string)
  • null (unset)

が使われます。

他にも配列にキャストする(array)、オブジェクトへキャストする(object)、バイナリにキャストする(binary)がありますがこれはまた別の機会に。

小数点以下を含む数値33.4を整数にキャストする次のコード
(int) 33.4
は、整数値の33になります。

これはどうでしょう?

(bool) 1

数値の1を論理値に変換するとtrueになります。

ではこれは?

(string) false

論理値falseは文字列に変換すると空文字列''になります。

こんなのもあります。

(unset) 100.0

これはnullになります。

nullに変換するキャストは(null)とは記述せずに(unset)と記述します。

10進数以外の数値の文字列の変換

(int)を使って文字列を変換するとき、その文字列は10進数として扱われます。

例えば(int) '123'はもちろん123と変換されますが、8進数の文字列'0123'(int) '0123'としても、10進数の83には変換されず、123になります。

このために10進数以外の数値の文字列を変換するにはそのための命令(関数)が用意されています。

bindec – 2進数から10進数へ変換

octdec – 8進数から10進数へ変換

hexdec – 16進数から10進数へ変換

これの逆、10進数からn進数への変換をするdecbindecoctdechexもありますよ。

さあ、どんなところで使っていくかはこれからですね。

それではまた!

Onto PHP 目次