PHPのデータ型

前章の学習では変数の基本的な使い方について学んできました。文字列が代入された変数を「連結」したり、数値が代入された変数同士を「足し算」することも経験しました。

(前章:PHP入門第2章『変数』

ところで、これまでの学習の中で「文字列」や「数値」といったワードを頻繁に使って、両者をしつこく区別してきたことに、なんとなく気づいたでしょうか?

プログラミングでは、その値が「文字列型」であるのか「数値型」であるのか(あるいはまた別の型のものであるのか)が、とても重要になります。

本章ではデータ型というものについて、詳しく学んでいくことにしましょう。

文字列型と数値型

次のファイルを作成して、コードを書いて下さい。

<?php
  $data1 = "こんにちは";
  $data2 = 30;

  print $data1 . $data2;
  print PHP_EOL;
  print $data1 + $data2;
  print PHP_EOL;

これを実行してみると

こんにちは30
PHP Warning:  A non-numeric value encountered in(〜略〜)
30

このような結果となりました。

$data1には文字列型の「こんにちは」が代入され、 $data2 には数値の「30」が代入されています。
この2つの変数について、最初に「文字列同士の連結」をしようとしています。その結果が次のようになりました。

こんにちは30

その次に「数値同士の足し算」を実行しようとしています。その結果は次のようになりました。

PHP Warning:  A non-numeric value encountered in(〜略〜)
30

Warning:〜となっていますね。訳してみると「数値ではない値に遭遇しました」と言っています。これが「エラーメッセージ」です。とはいえ、これは「警告」であって致命的なエラーとまではいきません。したがって、PHPはなんとかこの処理を終えようとして、最後に「30」とだけ出力してくれています。

ここで何が起こったのか、少し詳しく見てみましょう。

暗黙的な型変換

最初の「文字列と数値の連結」について。

$data1 = "こんにちは"; // 文字列
$data2 = 30; // 数値

print $data1 . $data2; // 文字列と数値を連結しようとしている

出力結果

こんにちは30

数値 30 は文字列のように連結することはできないはずですが、このコードを見る限り連結はうまくいっているようです。

これは、PHPの特徴のひとつ暗黙の型変換が行われているためです。

print $data1 . $data2;

print文は「$data1 の文字列 ”こんにちは” を出力して、次に続く $data2 の値を連結するんだな」と認識します。ところが$data2の型は「数値」です。PHPはとても気が利く世話好き屋さんな言語なので、「30は数値だけど、数字として文字列扱いすれば連結できるな」と判断します。そして、暗黙のうちに「数値の 30 から文字列の "30" への型変換」を一時的に行ってくれるのです。

この柔軟さがPHPの特徴です。なるべくエラーを出さずに裏でなんとかしようとしてくれるので、初心者にとってはありがたいですね。とはいえ、このような柔軟な挙動というのは、じつは大きな規模のプログラムには向きません。

プログラムにとってデータ型というのはとても重要です。それが知らない内に変わってしまうということは、意図していない挙動を引き起こすことにつながりかねません。プログラムの規模が大きくなればなるほど、その危険性は潜在的に高まっていきます。
PHP以外の言語、例えばJavaやC言語などでは、型を適切に扱わないとすぐにエラーになります。そのため、大規模な開発にはこれらの言語の方が向いているとも言われます。

どちらが優れているか劣っているかではなく、向き不向きの問題です。PHPでもやりようによっては大規模開発にも充分耐えられますし、それぞれの言語によって向いているプロジェクトのタイプは異なります。

明示的な型変換(型キャスト)

さて、暗黙の型変換といいましたが、明示的にそれを行うにはどうすれば良いでしょうか。先ほどのケースで考えてみましょう。

$data1 = "こんにちは"; // 文字列
$data2 = 30; // 数値

print (int) $data1 + $data2; // 数値同士の足し算(0 + 30)となる

ここで登場した (int)型キャスト(または型変換)といいます。続く値に対して数値型への変換を試みます。数値型の中でも特に、小数点を考慮しない整数型への変換を行います。なお、intはintegerの略で、整数という意味です。

このコードの場合、$data1には「こんにちは」という文字列が入っています。文字列は数値型ではありませんので、もしこれを無理やり整数値として扱うならば「0」ということになるでしょう。つまり 0 + 30 = 30 ということになります。

型キャストを行わなかった最初のコードではWarningが発生しつつ、30と出力されました。

PHP Warning:  A non-numeric value encountered in(〜略〜)
30

PHPからすれば、 100%の責任は持てないものの、最も妥当な解決策として (int) $data1 で整数に型変換しつつ、警告を発しておいた、ということになります。

明示的に型変換を行ってあげれば、このエラーは安全に解消することができます。PHPではなくプログラマがこの変換について責任を持つことになるからです。

$data1 = "こんにちは"; // 文字列
$data2 = 30; // 数値

print (int) $data1 + $data2; // 数値同士の足し算となる
print PHP_EOL;

実行してみましょう

30

エラーが消えましたね。

整数型だけでなく文字列型への型キャストももちろん可能です。この場合は (string)を使います。

$data1 = "こんにちは"; // 文字列
$data2 = 30; // 数値

print $data1 . (string) $data2;

結果

こんにちは30

データ型の種類

文字列型と数値型(整数型)を例に説明をしてきました。データ型と型キャストについて十分に理解できたところで、PHPで扱うその他のデータ型についても見ていくことにしましょう。

データ型 説明 型キャスト
boolean 論理型 (bool), (boolean)
integer 整数型 (int)
float(double) 浮動小数点型 (float), (double)
string 文字列型 (string)
array 配列型 (array)
object オブジェクト型 (object)
resource リソース型
NULL ヌル型 (unset)

論理値型

論理値型(boolean)は真(true)と偽(false)の値を表す型で、値はこの2つのみです。真偽値とも言います。

整数型

整数を表す型です。10進数の他、8進数と16進数についても扱えます。小数については考慮されません。

浮動小数点型

小数を持つ数値を扱う型です。精度の違いでfloat型とdouble型があるなど、やや扱いが難しいです。

配列型

配列は複数の異なる値をまとめて保持しておくことができます。配列は使用頻度が高く、とても重要です。本コースでも後ほど詳しく取り上げていきます。

オブジェクト型

オブジェクトを扱う型です。オブジェクトについては後の章で取り上げますが、簡単にいうと「ある目的を果たす機能について、変数と関数をひとまとまりにしたもの」です。PHPに元々組み込まれているオブジェクトもあれば、ユーザ(開発者)が独自に定義するオブジェクトもあります。

リソース型

リソース型は、外部リソースへの参照を保持する型です。初学者はなんとなく「そういうものがあるんだな」くらいに捉えておけばよいでしょう。

ヌル型

ヌル(null)とは「何もない」という値を扱う特殊な型です。ヌルはプログラミングではとても重要な概念です。何もないからといって疎かにしないようにしましょう。


前章:PHP入門第2章『変数』
次章:PHP入門第4章『配列』