PHP入門 データ型

最終更新日

PHPのデータ型について解説しています。

概要

データ型とは、データの種類のことです。PHPでは、さまざまなデータをコードの中で扱えます。たとえば、「abc」や「あいうえお」は文字列型、1や10は数値型、true(真)やfalse(偽)は真偽型に分類できます。PHPは、データ型に対して寛容です。最初に文字列を格納した変数にあとから数値をセットしても問題ありません。変数のほうが中身に応じて自動的に形を変えてくれます。このような性質を動的型付けと言います。

次のようなスクリプトもPHPでは正常に実行できます。

$data = 'お祭り大辞典';
$data = 2024;          //文字列が代入された変数に数値を代入

PHPで利用できるデータ型

分類データ型概要
スカラー型論理型(bool)true(真)またはfalse(偽)
整数型(int)10進数、16進数(0xで始まる値)、8進数(0で始まる値)など
浮動小数点型(float、double)1.8×10308が最大値(ただし、プラットフォームに依存)
文字列型(string)クォートで囲まれた0個以上の文字の集合
複合型配列型(array)データの集合
オブジェクト型(object)データと手続きの集合
コールバック型(callable)一連の処理の集合
特殊型リソース型(resource)外部リソースへの参照
ヌル型(null)値が未定義であることを表す

スカラー型とは、1つの変数で1つの値だけを扱うことができるものを言います。データ型の中でも最も基本的なものです。スカラー型と対照的なのが複合型で、この型は1つの変数で複数の値をまとめて扱えます。そして特殊型は、スカラー型/複合型のいずれにも分類できない特殊な値を表す型のことです。

論理リテラル(bool)

論理型は、スカラー型の中でも最も単純な型で、真か偽のいずれかの状態しか保有しません。それぞれtrue(真)/false(偽)というキーワードで表現できます。true/falseは、大文字/小文字を区別しないので、True/False、TRUE/FALSEと書いてもかまいません。

PHPでは、論理リテラルを必要とする状況で、次の値を自動的にfalseとみなします。

  • 空文字列、または文字列の0(ゼロ)
  • 整数リテラルの0、-0(ゼロ)
  • 浮動小数点数リテラルの0.0、-0.0(ゼロ)
  • 要素数が0である配列(空)
  • null(未定義値)

整数リテラル(int)

整数リテラルの分類

  • 10進数リテラル(0、3、-12)
  • 2進数リテラル(0b1111、0b101)
  • 8進数リテラル(0777、0644、0600)
  • 16進数リテラル(0xFF、0xAA00BB)

10進数は、整数(10、+108)、負数(-1、-15)、ゼロ(0)を表現できます。10進数の他に、16進数、8進数、2進数も表現できます。16進数は0~9に加えてa~fのアルファベットで10~15を表し、接頭辞に「0x」を付与します。同様に、8進数は0~7で値そのものを表し、接頭辞として0(ゼロ)を付与します。2進数は0/1で数値を表し、接頭辞は「0b」です。「x」「b」は、それぞれ「heXadecimal」(16進数)、「Binary」(2進数)の意味です。大文字小文字は区別しません。

浮動小数点リテラル(float)

浮動小数点リテラルは一般的な「1.41421356」のような小数点だけでなく、指数表現があります。

指数表現とは

<仮数部>e<符号><指数部>の形式で表されるリテラルのことです。

<仮数部>×10の<符号><指数部>

で、本来の小数値に変換できます。一般的には、非常に大きな(小さな)数値を表すために利用します。

1.4142e10→1.4142×1010→14142000000.0

1.173205e-7→1.173205×10-7→0.0000001173205

指数を表す「e」は大文字小文字を区別しません。

指数表現では、1732を「173.2e1」(173.2×10)、「17.32e2」(17.32×102)、「1.732e3」(1.732×103)・・・のように同じ値を複数のパターンで表現できてしまいます。そこで、一般的には、仮数部が「0.」+「0以外の数値」で始まるように表さすことで表記を統一します。
この例であれば、「0.1732e4」または、先頭を省略した「.1732e4」とします。

数値セパレーター

PHP7.4以降では、桁数の大きな数値の可読性を改善するために、数値リテラルの中に桁区切り文字(_)を記述できるようになりました(数値セパレーター)

$value = 1_234_567;
$pi = 3.141_592_653_59;
$num = 0.123_456e10;

桁区切り文字である「,(カンマ)」でないのは、PHPにおいてカンマはすでに別の意味を持っているためです。数値セパレーターは、可読性を助ける記号のため、数値リテラルの中で自由に差し込むことができます。一般的には3桁単位で区切ります。ただし、数値セパレーターを挿入できるのは数値の間だけです。

12_34_56       //2桁ごとに区切り
1_23_456_7890  //異なる桁での区切り
0b01_01_01     //10進数で21

文字列リテラル

文字列リテラルを表すには、文字列全体をシングルクォート(’)またはダブルクォート(”)でくくります。

'はじめまして、PHP'
"はじめまして、PHP"

よって、文字列リテラルには「’」「”」そのものを含めることはできません。

1、文字列に含まれていないほうをクォートでくくる

文字列にダブルクォートが含まれる場合は、シングルクォートでくくります。また、その逆のケースは、ダブルクォートでくくります。

print 'はじめまして、"山田太郎"です。'

2、クォート文字をエスケープ処理する

文字列にシングルクォートとダブルクォートが含まれる場合は、文字列に含まれるクォート文字をエスケープ処理します。「\”」とすることで、文字列のダブルクォートと認識されます。

print 'はじめまして、\"山田太郎\"です。'

シングルクォートの場合も同様

print "はじめまして、\'山田太郎\'です。"

エスケープシーケンス

PHPではタブや改行など特殊意味を持つ文字を「\文字」の形式で表現できます。このような文字をエスケープシーケンスと言います。また、エスケープシーケンスを認識できるのは、ダブルクォート文字列だけです。シングルクォート文字列では「\’」(シングルクォート)と「\\」(バックスラッシュ)だけ認識され、それ以外のエスケープシーケンスはそのまま表示されます。

PHPで利用可能な主なエスケープシーケンス

エスケープシーケンス概要
\r復帰(キャリッジリターン)
\n改行(ラインフィード)
\t水平タブ
\v垂直タブ
\fフォームフィード
\$ドル記号
\\バックスラッシュ(円記号)
\”ダブルクォート
\nnn3桁の8進数nnnで表された文字
\xnn2桁の16進数nnで表された文字
\u{nnnn}4桁の16進数nnnnで表されたUnicode文字

シングルクォート文字列とダブルクォート文字列の違い

ダブルクォートかシングルクォートのいずれでくくるかによって、文字列を解釈する方法が変化します。ダブルクォート文字列リテラルでは、文字列に含まれる変数を解釈し、その値で変数の箇所を置き換えます。

基本的には文字列リテラルはシングルクォートで囲み、変数展開やエスケープシーケンスの利用などの意図がある場合にのみダブルクォート文字列を利用するのがよいでしょう。

<?php
$title = '俺のふれんちレストラン-青空店-';
$data1 = "紹介サイト\t「{$title}」へ<br />";
$data2 = '紹介サイト\t「{$title}」へ<br />';
print $data1;
print $data2;
実行結果
実行結果

変数全体を{}で囲んでいるのは、変数の範囲を明確にするためです。次のように変数は囲みます。

"I am {$data}man"
"I am ${data}man"

ヒアドキュメント

ヒアドキュメントは、改行を含むような長い文字列を表すのに適した記法です。ヒアドキュメントでは「<<<EOD」から「EOD;」までを文字列リテラルとみなします。「EOD」は文字列の開始と終了を表すためのデリミタ(区切り文字)なので、開始と終了とが対応していれば自由に変更してもかまいません。

例えば、「<<<CONTENT~CONTENT;」や「<<<TEST~TEST;」なども認識します。開始/終了文字列は小文字で表記してもかまいませんが、文字列リテラルそのものと識別しやすいように、すべて大文字で表すのが一般的です。

<?php
$str = '俺のフレンチレストラン';
$msg = <<<EOD
{$str}は、来年で10周年を迎える有名レストランです。
まずは、テレビでも紹介されたアップルパイがおすすです。
"Let's Go!"
EOD;
print $msg;
実行結果
実行結果

インデントの除去

ヒアドキュメントでは、終了文字列のインデント位置によって、先頭部分の空白が除去されます。次のコードであれば、先頭部分の空白が除去されます。

 <?php
$str = '俺のフレンチレストラン';
$msg = <<<EOD
     {$str}は、来年で10周年を迎える有名レストランです。<br>
     まずは、テレビでも紹介されたアップルパイがおすすです<br>。
     "Let's Go!"
     EOD;
print $msg;
実行結果
実行結果

終了文字列よりもインデントが少ない行は不可です。

<?php
$str = '俺のフレンチレストラン';
$msg = <<<EOD
     {$str}は、来年で10周年を迎える有名レストランです。<br>
     まずは、テレビでも紹介されたアップルパイがおすすです<br>。
"Let's Go!"
     EOD;
print $msg;
実行結果
実行結果
Parse error: Invalid body indentation level (expecting an indentation level of at least 5) in E:\xampp\htdocs\hello.php on line 12
PHP7.2以前の環境では、終了文字列のある行には、
終了文字列自身とセミコロン以外が含まれてはならない
というルールがあります。(タブ/空白によるインデントも不可です。)

ヌル(null)

ヌル型は、ある変数が値を持たないことを表し、唯一のリテラルとしてnullを持ちます。次の条件の変数はnullとみなされます。

  • 変数に値が代入されていない場合
  • 変数に名詞的にnullが代入された場合
  • unset関数で変数の内容が破棄された場合
<?php
$n1;         //値が代入されていない
$n2 = null;  //明示的にnullを代入