PHPでは変数の型定義は、基本的に行いません。
どのような値を変数に代入するかによって、PHP が実行時に決定します。
ただし、プログラマーが型を意識しなくてよいわけではありません。
型を事前に定義しなくてよい反面、理解が浅いと、いつの間にか思わぬ型に変わっていてバグの原因になりかねません。
この記事を読むことで、PHPにはどのような型が存在し、それぞれどのように扱われるのかがわかるようになります。
はじめに
冒頭でも説明しましたが、PHPは変数の型を基本的には定義しません。
以下のようなコードの記載も可能です。
<?php
$greeting = "Hello World!\n"; // 文字列を代入
echo $greeting;
$greeting = 123; // 同じ変数に数字を代入
echo $greeting;
----------------------------------------
Hello World!
123
ただし、データ型を意識しなくてよいわけではありません。
データを演算/比較する場面では、データ型によって挙動が変化します。
そのため、PHPでも型の理解は必要です。
10種類の基本型
PHPには下記表の通り、10種類の基本型があります。
分類 | データ型 | 概要 |
スカラー型 | 論理値(bool) | true(真)またはfalse(偽) |
整数(int) | 10進数、16進数、8進数等 | |
浮動小数点数(float) | 小数点数と指数表現 | |
文字列(string) | 引用符(' )で括られた0個以上の文字の連結 | |
複合型 | 配列(array) | 順番付け/名前付けしたデータの集合 |
オブジェクト(object) | データと手続きの集合 | |
callable | 一連の処理(手続き)の集合 | |
iterable | 疑似型。array、またTraversableインターフェイスを実装したオブジェクトを許容。 | |
特別な型 | リソース(resource) | 外部リソースへの参照を保持 |
ヌル(NULL) | 値を持たないことを表す |
参考)PHP公式マニュアル:型
それぞれのデータ型について
スカラー型
スカラー型とは、1つの変数で1つの値だけを扱うことができる型です。
4種類存在します。
論理値(bool)
bool型は、最も簡単な型です。真偽値を表します。
真偽値は、true または false のどちらかです。
大文字小文字の区別はありません。
<?php
$testFlag = true;
var_dump($testFlag); // bool(true)
$testFlag = TRUE;
var_dump($testFlag); // bool(true)
$testFlag = false;
var_dump($testFlag); // bool(false)
$testFlag = FALSE;
var_dump($testFlag); // bool(false)
// ※もちろん変数使わずに直接記載しても同じ結果
var_dump(true); // bool(true)
他のデータ型をbool型に変換する場合、次の値はfalseとみなされます。
(その他値は全てtrueです)
- bool の false
- int の 0
- float の 0.0 及び -0.0
- 空の文字列、及び文字列の “0”
- 要素の数が0である 配列
- NULL
- 属性がない空要素から作成された SimpleXML オブジェクト。つまり、子要素も属性もない要素。
<?php
var_dump((bool) 0); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) 0.0); // bool(false)
var_dump((bool) -0.0); // bool(false)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) -0.1); // bool(true)
var_dump((bool) ""); // bool(false)
var_dump((bool) "0"); // bool(false)
var_dump((bool) "false"); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) null); // bool(false)
$xmlStr = "<?xml version='1.0' standalone='yes'?><sample></sample>";
var_dump((bool) new SimpleXMLElement($xmlStr)); // bool(false)
$xmlStr = "<?xml version='1.0' standalone='yes'?><sample>A</sample>";
var_dump((bool) new SimpleXMLElement($xmlStr)); // bool(true)
整数(int)
int型は、10進数、2進数、8進数、16進数での表記が可能です。
また、オプションで先頭に符号(-または+)を付けることが可能です。
※通常、意味がないので+符号をつけることはありません。
2進数は、0/1で数値を表し、接頭辞には「0b」を付けます。
8進数は、0~7で数値を表し、接頭辞には「0」を付けます。
PHP8.1以降では、「0o」
や「0O
」を付けても 8進数表記となります。
16進数は、0~9に加えてA~Fのアルファベットで10~15を表し、接頭辞には「0x」を付けます。
<?php
$a = 1234; // 10進整数
$a = 0123; // 8進数
$a = 0o123; // 8進数 ※PHP8.1以降
$a = 0x1A; // 16進数
$a = 0b11111111; // 2進数
$a = 1_234_567; // 10進数
また、数値セパレーター「_」を利用して、桁数の大きな数値に対する可読性を上げることも可能です。
(日常的にはカンマ(,)で区切るが、カンマは既に別の意味を持っているため「_」が使用されている)
セパレーターは、数値の間に自由に挟むことができるため、3桁区切りではなくてもエラーにはなりません。数値の間ではない場合はエラーになります。
<?php
$a = 1_234_567; // 正常
$a = 1_2_3_4_5_6_7; // 正常
#$a = _1234567; // エラー
#$a = 1234567_; // エラー
#$a = 0_x1A; // エラー
浮動小数点数(float)
一般的な1.1234というような少数点数だけではなく、指数表現が行えます。
指数表現は、非情に大きな/小さな値を表すのに用いられます。
<?php
$a = 1.234;
$a = 1.2e3;
$a = 7E-10;
$a = 1_234.567;
文字列(string)
string は、文字が連結されたものです。
次の4つの方法で指定することが可能です。
- 引用符(シングルクォート)
- 二重引用符(ダブルクォート)
- ヒアドキュメント構文
- Nowdoc構文 ※ヒアドキュメントの開始文字列をシングルクォートで括る版
以下にそれぞれの例を示します。
記載方法に加え、変数やエスケープシーケンスが展開されるかについても注目してください。
引用符(シングルクォート)
変数やエスケープシーケンスが展開されません。
値にダブルクォートの使用が可能です。
値にシングルクォートを使用する場合は、「\」でエスケープします。
<?php
$tmp = 123;
echo '値は $tmp です。\n ';
echo '"Hello!"\n';
echo '\'Hello!\'\n';
------------------------------
値は $tmp です。\n "Hello!"\n'Hello!'\n
二重引用符(ダブルクォート)
変数やエスケープシーケンスが展開されます。
値に変数を含める場合、どこまでが変数なのかを明確にするために{}が使えます。
${tmp} または {$tmp} の形式です。基本的に{}を使用することをお勧めします。
値にシングルクォートの使用が可能です。
値にダブルクォートを使用する場合は、「\」でエスケープします。
<?php
$tmp = 123;
echo "値は $tmp です。\n";
echo "値は ${tmp} です。\n";
echo "値は {$tmp} です。\n";
echo "'Hello!'\n";
echo "\"Hello!\"";
------------------------------
値は 123 です。
値は 123 です。
値は 123 です。
'Hello!'
"Hello!"
ヒアドキュメント構文
「<<< EOD」 ~ 「EOD;」が文字リテラルとみなされます。
変数やエスケープシーケンスは展開されます。
<?php
$tmp = 123;
$msg = <<< EOD
値は {$tmp} です。\n
"Hello!"
'Hello!'
EOD;
echo $msg;
------------------------------
値は 123 です。
"Hello!"
'Hello!'
Nowdoc構文
ヒアドキュメントの開始文字列をシングルクォートで括る形です。
ヒアドキュメントとの違いは、変数やエスケープシーケンスが展開されない点です。
<?php
$tmp = 123;
$msg = <<< 'EOD'
値は $tmp です。\n
"Hello!"
'Hello!'
EOD;
echo $msg;
------------------------------
値は $tmp です。\n
"Hello!"
'Hello!'
複合型
複合型とは、スカラー型とは対照的で、1つの変数で複数の値を扱うことができる型です。
4種類存在します。
配列(array)
配列
配列は、実際には順番付け(インデックス)されたマップです。
array() または、[]で定義します。
どちらを使っても機能としては同じなのですが、他の言語でも配列を[]で表すことが多いので、可読性の観点から[]を使うようにしましょう。
<?php
// array()
$tmp_array = array("a","b","c","a");
print_r($tmp_array);
echo "$tmp_array[0]\n";
echo "$tmp_array[1]\n";
// 配列の短縮構文
$tmp_array = ["a","b","c","a"];
------------------------------
Array
(
[0] => a
[1] => b
[2] => c
[3] => a
)
a
b
「0」や「1」などのインデックスをキーにして、「a」や「b」などの値が格納されています。
キーには、整数 または 文字列が使えます。
各値を取得するには、変数の後ろに[キー]を指定します。
配列の場合のキーはインデックスになります。
連想配列
それぞれの値毎に(インデックスではなく)名前を付けた配列のことです。
以下の形式で定義します。
[キー => 値]
<?php
$tmp_array = [
0 => "a",
"id" => 123,
"name" => "Taro",
"age" => 20
];
print_r($tmp_array);
echo "$tmp_array[0]\n";
echo "$tmp_array[name]\n";
------------------------------
Array
(
[0] => a
[id] => 123
[name] => Taro
[age] => 20
)
a
Taro
多次元配列
配列の配列のことを多次元配列と言います。
<?php
$tmp_array = [
["a1","a2"],
["b1"],
["address" => "c1"]
];
print_r($tmp_array);
echo "{$tmp_array[0][1]}\n";
echo "{$tmp_array[1][0]}\n";
echo "{$tmp_array[2]['address']}\n";
------------------------------
Array
(
[0] => Array
(
[0] => a1
[1] => a2
)
[1] => Array
(
[0] => b1
)
[2] => Array
(
[address] => c1
)
)
a2
b1
c1
オブジェクト(object)
変数と関数をまとめたものである「クラス(class)」という設計図をもとに作られた実態がオブジェクト(object)です。
※より詳細は、また別の機会に記載予定です。
以下は new
命令により、クラスからオブジェクトのインスタンスを作成し、作成したインスタンスを通してメソッドの呼び出しを行っています。
<?php
// クラス定義
class foo
{
// メソッド定義
function do_foo()
{
echo "foo を実行します。\n";
}
}
// インスタンス化
$bar = new foo;
// メソッド呼び出し
$bar->do_foo();
print_r($bar);
------------------------------
foo を実行します。
foo Object
(
)
callable
callcable型は、コールバック関数を引数に受け取る際の型のことです。
※より詳細は、また別の機会に記載予定です。
関数の引数の型がcallableとなっていて、文字列として関数を渡しています。
<?php
// 関数定義
function hello(string $name)
{
echo "Hello {$name}!\n";
}
// 関数定義。型はcallcable。※型定義は省略可能。
function func(callable $method, string $name)// 「$method」がコールバック関数
{
// 変数名の後ろに()を付けることで関数として呼び出せる
echo $method($name);
}
// hello()関数を文字列として渡す
func("hello", "world");
iterable
foreach で繰り返し可能な型のことです。
<?php
function foo(iterable $iterable) {
foreach ($iterable as $value) {
echo "{$value}\n";
}
}
foo([1,2,3]);
------------------------------
1
2
3
※より詳細は、以下ご確認ください。
PHP公式マニュアル:Iterable
https://www.php.net/manual/ja/language.types.iterable.php
特殊型
特殊型とは、スカラー型/複合型のいずれにも分類できない型です。
2種類存在します。
リソース(resource)
リソース は特別な変数であり、オープンされたファイル、データベース接続等の外部リソースへのリファレンスを保持するものです。
特別な関数により作成され、使用されます。
以下、ファイルオープン時のファイルハンドルの例です。
<?php
$f = fopen("tmp.txt", "a");
var_dump($f);
------------------------------
resource(5) of type (stream)
ヌル(NULL)
ヌル(NULL)は、変数が値を持たないことを表します。
次の条件のものは全てnullを意味します。
- 変数に値が代入されていない場合
- 変数に明示的にnullが代入された場合
- unset関数で変数の内容が破棄された場合
<?php
//変数に値が代入されていない場合
$tmp;
var_dump($tmp);//★1
//変数に明示的にnullが代入された場合
$tmp = null;
var_dump($tmp);//★2
//unset関数で変数の内容が破棄された場合
$tmp = 123;
var_dump($tmp);//★3
unset($tmp);
var_dump($tmp);//★4
------------------------------
//★1
Warning: Undefined variable $tmp in C:\xampp\htdocs\test\Test001.php on line 4
NULL
//★2
NULL
//★3
int(123)
//★4
Warning: Undefined variable $tmp in C:\xampp\htdocs\test\Test001.php on line 12
NULL
まとめ
PHPの基本型についての表を再度載せておきます。
もう一度見直して、それぞれどのような内容だったか思い出してみましょう。
分類 | データ型 | 概要 |
スカラー型 | 論理値(bool) | true(真)またはfalse(偽) |
整数(int) | 10進数、16進数、8進数等 | |
浮動小数点数(float) | 小数点数と指数表現 | |
文字列(string) | 引用符(' )で括られた0個以上の文字の連結 | |
複合型 | 配列(array) | 順番付け/名前付けしたデータの集合 |
オブジェクト(object) | データと手続きの集合 | |
callable | 一連の処理(手続き)の集合 | |
iterable | 疑似型。array、またTraversableインターフェイスを実装したオブジェクトを許容。 | |
特別な型 | リソース(resource) | 外部リソースへの参照を保持 |
ヌル(NULL) | 値を持たないことを表す |
参考)PHP公式マニュアル:型
以上でPHPの型についての説明は終わります。
PHPの型にはどのような型が存在するのか、入門レベルの知識が得られたのではないかと思います。
コメント