【PHP】使用できるデータ型まとめと概要

まだ学習途中の型についてはタイミングをみて追記予定

## データ型とは
データの種類のこと

以下、PHPで利用できる主なデータ型

- スカラー型
    - 文字列型(string)
    - 整数型(int,integer)
    - 浮動小数点型(float,double,real)
    - 論理型(bool,boolean)
- 複合型
    - 配列型(array)
    - オブジェクト型(object)
- 特殊型
    - リソース型(resource)
    - ヌル型(null)


### PHPはデータ型に対して寛容
JavaやC#のような言語は、文字列を格納するための変数に数値を代入することはできない
だが、PHPでは最初に文字列を格納した変数に整数型を代入もしくは整数型を格納した変数に文字列を代入することができる

```php
<?php
$data = 'Hello world!';
echo $data; //実行結果:Hello world!

$data = 123;
echo $data; //実行結果:123
```

ただし、厳密な演算や比較を行う場面ではそれなりにデータ型を意識する必要があるので、型を全く意識しなくて良いわけではない

# 1 スカラー型
ひとつの変数でひとつの値(リテラル)だけを扱うことができる型のこと

## 1.1 文字列型(string)

文字列リテラルを表すには文字列全体をシングルクオート、もしくはダブルクオートでくくる

```php
$str1 = 'Hello world!'; //シングルクオート
$str2 = "Hello world!"; //ダブルクオート
```

参考：[PHP: 文字列 - Manual](https://www.php.net/manual/ja/language.types.string.php)

### シングルクオートとダブルクオートの違い
#### 変数を展開するか
ダブルクォートで囲った場合は文字列に含まれる変数を解釈し展開する

```php
$name = 'Tanaka';
$str1 = "彼の名前は{$name}です。";
$str2 = '彼の名前は{$name}です';

echo $str1; //実行結果：　彼の名前はTanakaです。
echo $str2; //実行結果：　彼の名前は$nameです。
```

#### エスケープシーケンスを認識するか

エスケープシーケンスを認識するのはダブルクォート文字列だけ
シングルクオート文字列では`\'`と`\\`だけが認識される

```php
$str1 = "彼の名前は\nTanakaです。";
$str2 = '彼の名前は\nTanakaです';

echo $str1; 
/*実行結果： 彼の名前は
Tanakaです。*/
echo $str2; /*実行結果：　彼の名前は\nTanakaです。*/
```

### 文字列にクォートを含めたい場合
文字列にクォートを含めたい場合は、

- 文字列に含まれない方のクォートでくくる
- エスケープ処理をする

これらで対応する

__文字列に含まれない方のクォートでくくる__

```php
$str = "I'm your mother.";
echo $str; // 実行結果： I'm your mother.
```

文字列中にシングルクオートとダブルクオートの両方を含めたい場合、この方法では対処できないという問題がある
このようなケースでは、クォート文字をエスケープ処理することで対処する

__エスケープ処理をする__

```php
$str = 'She\'s "GREAT" my mother.';
echo $str; //実行結果： She's "GREAT" my mother.
```



### 結局どっちのクォートを使うべきか
基本的には文字リテラルはシングルクォートでくくり、
変数展開やエスケープシーケンスの利用などの意図がある場合のみダブルクォートを利用するのが好ましい



## 1.2 整数型(int,integer)

整数リテラルは以下が使用できる

- 10進数リテラル
- 2進数リテラル
- 8進数リテラル
- 16進数リテラル

符号(-または+)をつけて表現することもできる

参考：[PHP: 整数 - Manual](https://www.php.net/manual/ja/language.types.integer.php)

## 1.3 浮動小数点型(float,double,real)

少数点数だけでなく指数表現を使うこともできる

参考：[PHP: 浮動小数点数 - Manual](https://www.php.net/manual/ja/language.types.float.php)

## 1.4 論理型(bool,boolean)
`true(真)`か`false（偽）`のいずれかの状態をもつ
論理リテラルを必要とする状況で、次の値は自動的にfalseとみなす


```php
<?php
//空文字列、または文字列の0（ゼロ）
$str1 = '';
$str2 = '0';
var_dump((bool)$str1); //実行結果:bool(false)
var_dump((bool)$str2); //実行結果:bool(false)

//整数リテラルの0
$int = 0;
var_dump((bool)$int1); //実行結果:bool(false)

//浮動小数点の0.0
$float = 0.0;
var_dump((bool)$float); //実行結果:bool(false)

//要素数が0の配列
$arry = [];
var_dump((bool)$arry); //実行結果:bool(false)

//null(未定義値)
$data;
var_dump((bool)$data); //実行結果:bool(false)
```

参考：[PHP: 論理型(boolean) - Manual](https://www.php.net/manual/ja/language.types.boolean.php)
備考：[PHP: var_dump - Manual](https://www.php.net/manual/ja/function.var-dump.php) 

# 2 複合型

ひとつの変数で複数の値をまとめて扱うことができる型のこと


## 2.1 配列型(array)

スカラー型がひとつしか値を扱えなかったのに対し、配列には複数の値を収めることができる
要素に対してそれぞれ数値または文字列で名前をつけることができる

参考1：[PHP: 配列 - Manual](https://www.php.net/manual/ja/language.types.array.php)
参考2：[PHP: array - Manual](https://www.php.net/manual/ja/function.array.php)

### 配列を使うメリット

- 関連する値の集合をひとつの名前で管理できる
- 配列の中に配列を値として保持することができるので(__多次元配列__)、簡単にツリー構造を表現できる
- まとまった処理をする際にコードが書きやすくなる

### 通常配列と連想配列

数字で識別される配列を__通常配列__、
文字列で識別される配列を__連想配列__と呼ぶ

#### 通常配列

```php
//構文
$配列名 = [値1, 値2, ......];

//空の配列を作成する
$配列名 = [];
```

それぞれの要素には0から順に番号が割り振られる
`[]`でくくられた部分は__インデックス番号__、または__添字__と呼び、配列の何番目の要素を取り出すかを表す


```php
//構文
$配列名[インデックス番号]

//例
$ary = ['hoge', 'hogehoge', 'foo'];

print $ary[0]; //実行結果: hoge
print $ary[2]; //実行結果: foo

```

既に存在するインデックス番号が指定されると、既存の値が書き換えられる
インデックス番号が省略された場合には、その時点での最大インデックス番号+1の番号が割り振られる

```php
<?php
$ary = ['hoge', 'hogehoge', 'foo'];

$ary[0] = 'bar'; // 0番目の要素を書き換え
print ary[0]; //実行結果: 'bar'

$ary[] = 'hello'; // 末尾に要素を追加
print $ary[3]; //実行結果: hello

```

要素を削除するには`unset()`を使う
キー（インデックス番号）を指定しない場合はすべての要素が削除されNULLとなる

```php
<?php
$ary = ['hoge', 'hogehoge', 'foo'];
var_dump($ary);

/* 実行結果
array(3) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(8) "hogehoge"
  [2]=>
  string(3) "foo"
}
*/

unset($ary[0]); //0番目の要素を削除
var_dump($ary);

/* 実行結果
array(2) {
  [1]=>
  string(8) "hogehoge"
  [2]=>
  string(3) "foo"
}
*/

unset($ary); //全ての要素を削除
var_dump($ary); //実行結果：　NULL

```
備考1：[PHP: var_dump - Manual](https://www.php.net/manual/ja/function.var-dump.php)
備考2：[php配列の中身を手っ取り早く確認する](https://qiita.com/YuheiOgawa/items/d6f91ff52ef52893a2e4)

`unset()`で特定の要素を削除するとインデックス番号が歯抜けの状態になってしまうが、`array_splice()`を使うことで解決できる
削除後に自動的に要素が詰められる

```php
<?php
//構文
array_splice(配列, 削除開始位置, 削除する配列の要素数, 置き換える要素) //第3,4引数以降は省略可能

$ary = ['hoge', 'hogehoge', 'foo', 'bar'];
var_dump($ary);

/* 実行結果
array(4) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(8) "hogehoge"
  [2]=>
  string(3) "foo"
  [3]=>
  string(3) "bar"
}
*/

array_splice($ary, 1, 1); //1番目の要素を削除
var_dump($ary);

/*
array(3) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(3) "foo"
  [2]=>
  string(3) "bar"
}
*/

array_splice($ary, 1, 1, 'world'); //1番目の要素を削除して'bar'に置き換え
var_dump($ary);

/* 実行結果
array(3) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(5) "world"
  [2]=>
  string(3) "bar"
}
*/

array_splice($ary, 1); //1番目以降の要素を削除
var_dump($ary);

/*実行結果
array(1) {
  [0]=>
  string(4) "hoge"
}
*/

```

参考1：[PHP: array_splice - Manual](https://www.php.net/manual/ja/function.array-splice.php)
参考2：[PHPで配列の要素を削除する：unset, array_splice, array_shift, array_pop](https://uxmilk.jp/8884)
#### 連想配列
インデックス番号がキー名になることで、要素の対応関係がわかりやすくなる

```php
<?php
//構文
$配列名 = [キー1 => 値1, キー2 => 値2, ......];

//空の配列を作成する
$配列名 = [];
```
キー名には任意の文字列を指定できる
重複するキー名を指定した場合、エラーにはならず末尾のキー名が優先されて呼び出される
しかし__混乱を招くため指定するべきではない__

```php:重複だめ
$ary = ['foo' => 1, 'bar' => 2, 'foo' => 3];
print $ary['foo']; //実行結果: 3
```

__配列を複数行で書くときは__
配列最後の要素にはカンマを付けなくてもよいが、末尾の要素にカンマを付与しておくと後から要素を追加した場合にカンマ漏れが防げてよい
一行で書くときは冗長になるので省略する

```php
<?php
$ary1 = [
  'a',
  'b',
  'c',
];

$ary2 = [
  'a' => 1,
  'b' => 2,
  'c' => 3,
];
```

# 3 特殊型

スカラー型/複合型のいずれにも分類できない特殊な値を表す型

## 3.1 null型(null)

ある変数が値を持たないことを表し、唯一のリテラルとしてnullをもつ
次の条件で変数はnullであるとみなされる

- 変数に値が代入されていない場合
- 変数に明示的にnullが代入された場合
- `unset()`で変数の内容が破棄された場合


```php
<?php
$n1; // 値が代入されていないのでnull
$n2 = null; // 明示的にnullを代入
```

参考1：[PHP: NULL - Manual](https://www.php.net/manual/ja/language.types.null.php)
参考2：[PHP: unset - Manual](https://www.php.net/manual/ja/function.unset.php)

## 3.2 リソース型(resource)

>- リソース型はPHPの外部世界とやり取りを行うデータが格納されている型
>- リソースはデータベースや画像ファイルなどの外部情報
>
>(中略)つまり、リソースは、特別な関数により作成された外部情報を持つ変数のことです。そのような変数の型がリソース型となるのです。
>
>__出典：__[PHP の リソース型(resource) について](https://wepicks.net/resourcetype/)


備考：[PHP: リソース - Manual](https://www.php.net/manual/ja/language.types.resource.php)