【PHP】キャスト – 文字列型や数値型への変換

【PHP】キャスト – 文字列型や数値型への変換

PHPは型を意識せずプログラミングを行うことができますが、意図的に型を扱えるようになるとより正確なプログラムを作成できるようになります。

ここでは型の変換について解説します。

検証環境

キャスト

キャストは“型を変換する”ことです。

例えば、文字列型の1234を整数型に変換するなどです。

基本構文

(型) 変数または値

キャストする変数または値の前に丸括弧(())とその中に型名を記述します。

整数型(int)

整数型へのキャストは(integer)を使用します。

integerは省略形のintで記述が可能です。

浮動小数点数型 → 整数型

浮動小数点数型の整数型キャストは、小数点数以下を切り捨てます。

<?php
 
// 浮動小数点数型
$decimal = 1234.5678;
 
// キャスト
___ih_hl_start
$num = (int) $decimal;
___ih_hl_end
 
// 型と値の確認
echo '[ $decimal ]'."\n";
var_dump($decimal);

echo '[ $num ]'."\n";
var_dump($num);
 
?>
$ php sample.php
[ $decimal ]
float(1234.5678)
[ $num ]
int(1234)

文字列型 → 整数型

文字列を数値として扱える場合は整数型に変換します。

<?php

// 文字列型
$moji = '1234';

// キャスト
___ih_hl_start
$num = (int) $moji;
___ih_hl_end

// 型と値の確認
echo '[ $moji ]'."\n";
var_dump($moji);

echo '[ $num ]'."\n";
var_dump($num);
 
?>
$ php sample.php
[ $moji ]
string(4) "1234"
[ $num ]
int(1234)

文字列に数値に関する文字以外を含む場合は、先頭の文字から順に可能な限り整数型に変換します。

先頭の文字が変換できない場合は0になります。

<?php
 
$moji1 = '1234X';
$num1 = (int) $moji1;
echo '[ $num1 ] value : '.$num1."\n";
 
$moji2 = '12X34';
$num2 = (int) $moji2;
echo '[ $num2 ] value : '.$num2."\n";
 
$moji3 = 'X1234';
$num3 = (int) $moji3;
echo '[ $num3 ] value : '.$num3."\n";
 
?>
$ php sample.php
[ $num1 ] value : 1234
[ $num2 ] value : 12
[ $num3 ] value : 0

論理型 → 整数型

論理型の整数型キャストは、true1false0になります。

<?php

// 論理型
$bool1 = true;
$bool2 = false;

// キャスト
___ih_hl_start
$num1 = (int) $bool1;
$num2 = (int) $bool2;
___ih_hl_end

// 型と値の確認
echo '[ $bool1 ]'."\n";
var_dump($bool1);

echo '[ $num1 ]'."\n";
var_dump($num1);

echo "---------------------------\n";

echo '[ $bool2 ]'."\n";
var_dump($bool2);

echo '[ $num2 ]'."\n";
var_dump($num2);
 
?>
$ php sample.php
[ $bool1 ]
bool(true)
[ $num1 ]
int(1)
---------------------------
[ $bool2 ]
bool(false)
[ $num2 ]
int(0)

浮動小数点数型(double)

浮動小数点数型へのキャストは(float)または(double)を使用します。

整数型 → 浮動小数点数型

整数型の浮動小数点数型キャストは、通常正常に処理されます。

<?php

// 整数型
$num = 1234;

// キャスト
___ih_hl_start
$decimal = (float) $num;
___ih_hl_end

// 型と値の確認
echo '[ $num ]'."\n";
var_dump($num);

echo '[ $decimal ]'."\n";
var_dump($decimal);

?>
$ php sample.php
[ $num ]
int(1234)
[ $decimal ]
float(1234)

文字列型 → 浮動小数点数型

文字列を数値として扱える場合は浮動小数点数型に変換します。

<?php
 
// 文字列型
$moji = '1234.5678';
 
// キャスト
___ih_hl_start
$decimal = (float) $moji;
___ih_hl_end
 
// 型と値の確認
echo '[ $moji ]'."\n";
var_dump($moji);

echo '[ $decimal ]'."\n";
var_dump($decimal);
 
?>
$ php sample.php
[ $moji ]
string(9) "1234.5678"
[ $decimal ]
float(1234.5678)

文字列に数値に関する文字以外を含む場合は、整数型へのキャストと同様の処理になります。

<?php

$moji1 = '1234.5678X';
$decimal1 = (float) $moji1;
echo '[ $decimal1 ] value : '.$decimal1."\n";

$moji2 = '1234.56X78';
$decimal2 = (float) $moji2;
echo '[ $decimal2 ] value : '.$decimal2."\n";

$moji3 = '1234.X5678';
$decimal3 = (float) $moji3;
echo '[ $decimal3 ] value : '.$decimal3."\n";

$moji4 = 'X1234.5678';
$decimal4 = (float) $moji4;
echo '[ $decimal4 ] value : '.$decimal4."\n";

?>
$ php sample.php
[ $decimal1 ] value : 1234.5678
[ $decimal2 ] value : 1234.56
[ $decimal3 ] value : 1234
[ $decimal4 ] value : 0

論理型 → 浮動小数点数型

論理型の浮動小数点数型キャストは、true1false0になります。

<?php
 
// 論理型
$bool1 = true;
$bool2 = false;
 
// キャスト
___ih_hl_start
$decimal1 = (float) $bool1;
$decimal2 = (float) $bool2;
___ih_hl_end
 
// 型と値の確認
echo '[ $bool1 ]'."\n";
var_dump($bool1);

echo '[ $decimal1 ]'."\n";
var_dump($decimal1);

echo "---------------------------\n";

echo '[ $bool2 ]'."\n";
var_dump($bool2);

echo '[ $decimal2 ]'."\n";
var_dump($decimal2);
 
?>
$ php sample.php
[ $bool1 ]
bool(true)
[ $decimal1 ]
float(1)
---------------------------
[ $bool2 ]
bool(false)
[ $decimal2 ]
float(0)

文字列型(string)

文字列型へのキャストは(string)を使用します。

整数型 → 文字列

整数型の文字列型キャストは整数値をそのまま文字列に変換します。

<?php
 
// 整数型
$num = 1234;
 
// キャスト
___ih_hl_start
$moji = (string) $num;
___ih_hl_end
 
// 型と値の確認
echo '[ $num ]'."\n";
var_dump($num);

echo '[ $moji ]'."\n";
var_dump($moji);
 
?>
$ php sample.php
[ $num ]
int(1234)
[ $moji ]
string(4) "1234"

浮動小数点数型 → 文字列型

浮動小数点数型の文字列型キャストは整数値をそのまま文字列に変換します。

<?php
 
// 浮動小数点数型
$decimal = 1234.5678;
 
// キャスト
___ih_hl_start
$moji = (string) $decimal;
___ih_hl_end
 
// 型と値の確認
echo '[ $decimal ]'."\n";
var_dump($decimal);

echo '[ $moji ]'."\n";
var_dump($moji);
 
?>
$ php sample.php
[ $decimal ]
float(1234.5678)
[ $moji ]
string(9) "1234.5678"

論理型 → 文字列型

論理型の文字列型キャストは、true1falseは空文字になります。

<?php
 
// 論理型
$bool1 = true;
$bool2 = false;
 
// キャスト
___ih_hl_start
$moji1 = (string) $bool1;
$moji2 = (string) $bool2;
___ih_hl_end
 
// 型と値の確認
echo '[ $bool1 ]'."\n";
var_dump($bool1);

echo '[ $moji1 ]'."\n";
var_dump($moji1);

echo "---------------------------\n";

echo '[ $bool2 ]'."\n";
var_dump($bool2);

echo '[ $moji2 ]'."\n";
var_dump($moji2);
 
?>
$ php sample.php
[ $bool1 ]
bool(true)
[ $moji1 ]
string(1) "1"
---------------------------
[ $bool2 ]
bool(false)
[ $moji2 ]
string(0) ""

論理型(boolean)

論理型へのキャストは(boolean)を使用します。

整数型 → 論理型

整数型の論理型キャストは、0以外の数値(マイナス値を含む)はtrue0falseになります。

<?php
 
// 整数型
$num1 = 123;
$num2 = 0;
 
// キャスト
___ih_hl_start
$bool1 = (boolean) $num1;
$bool2 = (boolean) $num2;
___ih_hl_end
 
// 型と値の確認
echo '[ $num1 ]'."\n";
var_dump($num1);

echo '[ $bool1 ]'."\n";
var_dump($bool1);

echo "---------------------------\n";

echo '[ $num2 ]'."\n";
var_dump($num2);

echo '[ $bool2 ]'."\n";
var_dump($bool2);
 
?>
$ php sample.php
[ $num1 ]
int(123)
[ $bool1 ]
bool(true)
---------------------------
[ $num2 ]
int(0)
[ $bool2 ]
bool(false)

浮動小数点数型 → 論理型

浮動小数点数型の論理型キャストは、0以外の数値(マイナス値を含む)はtrue0falseになります。

<?php
 
// 浮動小数点数型
$decimal1 = 123.456;
$decimal2 = 0.000;
 
// キャスト
___ih_hl_start
$bool1 = (boolean) $decimal1;
$bool2 = (boolean) $decimal2;
___ih_hl_end
 
// 型と値の確認
echo '[ $decimal1 ]'."\n";
var_dump($decimal1);

echo '[ $bool1 ]'."\n";
var_dump($bool1);

echo "---------------------------\n";

echo '[ $decimal2 ]'."\n";
var_dump($decimal2);

echo '[ $bool2 ]'."\n";
var_dump($bool2);
 
?>
$ php sample.php
[ $decimal1 ]
float(123.456)
[ $bool1 ]
bool(true)
---------------------------
[ $decimal2 ]
float(0)
[ $bool2 ]
bool(false)

文字列型 → 論理型

文字列型の論理型キャストは、空文字(文字がない文字列)以外はtrue、空文字はfalseになります。

<?php
 
// 文字列
$moji1 = 'Hello World!';
$moji2 = '';
 
// キャスト
$bool1 = (boolean) $moji1;
$bool2 = (boolean) $moji2;
 
// 型と値の確認
echo '[ $moji1 ]'."\n";
var_dump($moji1);

echo '[ $bool1 ]'."\n";
var_dump($bool1);

echo "---------------------------\n";
echo '[ $moji2 ]'."\n";
var_dump($moji2);

echo '[ $bool2 ]'."\n";
var_dump($bool2);
 
?>
$ php sample.php
[ $moji1 ]
string(12) "Hello World!"
[ $bool1 ]
bool(true)
---------------------------
[ $moji2 ]
string(0) ""
[ $bool2 ]
bool(false)

明示的なキャスト

ソースコードにキャストを定義することを『明示的なキャスト』と呼びます。

それに対し、自動で型変換が行われる仕組みを『暗黙のキャスト』と言います。

演習問題

問題1

次の実行結果になるプログラムを作成してください。
なお、下記の条件を満たすものとします。

  • 文字列の"987"を$textに記憶
  • $textを整数型にキャストして$numberに記憶
$number (type)  -> integer
$number (value) -> 987

問題2

次の実行結果になるプログラムを作成してください。
なお、下記の条件を満たすものとします。

  • 文字列の"987.543"を$textに記憶
  • $textを浮動小数点数型にキャストして$numberに記憶
$number (type)  -> double
$number (value) -> 987.543

問題3

次の実行結果になるプログラムを作成してください。
なお、下記の条件を満たすものとします。

  • 整数型の987を$numberに記憶
  • $numberを文字列型にキャストして$textに記憶
$text (type)  -> string
$text (value) -> 987

問題4

次の実行結果になるプログラムを作成してください。
なお、下記の条件を満たすものとします。

  • 浮動小数点数型の987を$numberに記憶
  • $numberを文字列型にキャストして$textに記憶
$text (type)  -> string
$text (value) -> 987.543