PHPのデータ型を詳しく学ぶ。スカラー型/複合型/特殊型の違いとは

#近況報告

エンジニア転職成功しました。YouTubeでエンジニア転職したい方向けに情報発信しています。

https://www.youtube.com/channel/UCcXQG8lu_EdyP2Cbhtz1bcA


独習PHP第3版を学んでいるYUUKIです。
あまりデータ型について深い仕組みを知らなかったのですが、独習PHPを実践してみて初めて目にする情報も多かったのでまとめます。

##PHPで扱うデータ型について

- PHPは変数でデータ型をあまり意識しない
- Java,C#のような言語は変数に数字をセット出来ないなどの制限がある


###PHPで扱うことが出来る主なデータ型

- スカラー型　一つの変数に一つの値だけを扱うことができる
    - 論理型
    - 整数型
    - 浮動小数点型
    - 文字列型
- 複合型　一つの変数に複数の値をまとめて扱える
    - 配列型
    - オブジェクト型
- 特殊型　スカラー型にも複合型にも属さない
    - リソース型
    - ヌル型

####リテラルとは

変数に格納できる値そのもの、または値をスクリプトの中で表現する方法のこと。

###論理リテラル(bool)

- 真（true）が偽(false)のいずれかの状態しか持たない
- true、falseは大文字小文字を区別しない。（TRUE,FALSEでも通る）

PHPでFalseとみなす状況
- 空文字列、または文字列の０
- 整数リテラルの0
- 浮動小数点リテラルの0.0
- 要素数が0
- null（未定義）

例として、空文字（""）の戻り値はfalse

###整数リテラル(int)

- 正数、負数、ゼロを表現できる
- 2進数、8進数、16進数も表現できるが、先頭に接頭辞(0b,0,0x)を付ける必要がある

整数リテラルの分類

- 10進数リテラル(0,3,-12)
- 2進数リテラル(0b1111,0b101)→15,5
- 8進数リテラル(0777,0644,0600)→511,384,255
- 16進数リテラル(0xFF,0xAA00BB)→255,11176140

- 進数表記に削ぐわない（2進数で121、8進数で191など）場合はエラーとなるので注意。


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

- 指数表現を使った浮動小数点を使うことができる
- 指数表現→「仮数部 e 符号部　指数部」の形式で表せるリテラルのこと
- 例→3.548E5 = 3.458 * 10の二乗。　1.1414e-3 = 1.1414 * 10の-3乗を表す

**浮動小数点リテラルも整数リテラルもPHPからしたら数値として変わらない為、どちらか好きな表現を選ぶ**

###文字列リテラル

文字列リテラルは文字列をシングルクォート''、ダブルクォート""のどちらかで囲んで使用する

①文字列の中にシングルクォート、ダブルクォートを使いたい場合

```php
<?php
$str = "isn't it php"; ##ダブルクォーテーションで'を囲む
$sendMail = 'Hello, I'm "YUUKI"'; ##シングルクォーテーションで"を囲む
print $str."<br>";
print $sendMail;

//結果'がきちんと表示されている
isn't it php
Hello, I'm "YUUKI"
```

②""と''を両方含めたい場合→クォート文字をエスケープ処理する

- エスケープ処理とは？
特殊文字を変換し、無効化すること

例えば、以下のように、''の中に、'と"を両方含んだコードだと構文エラーとなる

```php
$str = 'Hello, I'm "Yuuki", You're Name? ';
```

なぜなら、''や""で一つの文字の塊とみなす為、間の文字が文字列として認識されない為。

今回の場合は、'を特別な意味を持たないただの文字列に変換します。

```php
$str = 'Hello, I\'m "Yuuki", You\'re Name? ';　//''の中にある'をエスケープ処理する
```

これでOK。
**PHPではエスケープ処理を行いたいリテラルの前に、\(バックスラッシュ)を使います。**

###シングルクォートとダブルクォートの違い

[PHPのダブルクォーテーション("")とシングルクォーテーション('')の違いを理解する](https://qiita.com/bitcoinjpnnet/items/64458299eaeefbacab44)

###エスケープシーケンスについて

「\文字」のように、改行やタブなど特殊な意味を持つ文字を「エスケープシーケンス」と呼ぶ。

PHPで主に使われるエスケープシーケンスは以下

- \r キャリッジリターン
- \n 改行
- \t 水平タブ
- \v 垂直タブ
- \f フォームフィード
- \$ ドル記号
- \\ バックスラッシュ
- \" ダブルクォート
- \nnn 3桁の8進数
- \xnn 2桁の16進数
- \U{nnnn} 4桁の16進数（Unicode文字 7.0から採用）

###ヒアドキュメント

複数行含めて文字列をリテラルを表す仕組みのこと


- 文字列リテラルの始まりと終わりを<<<EOD 中身 EOD; と表す
- EODで括った部分は全て文字列リテラルとみなす
- EODは開始と終了を表すためのデリミタ（区切り文字）
- EOD以外にも、<<<CONTENT~CONTENT;や、<<<HOGEHOGE ~ HOGEHOGE;などがある
- 開始/終了文字列は小文字で表記してもいいが、**文字列リテラルと識別できるようにしておくため、大文字で表すのが一般的**

例

```php
<?php
$str = 'PHP とは　Hypertext Preprocessorの略だよ';
$msg = <<<EOD
${str}。サーバーサイドで動作するスクリプト言語で、<br/>
DB連携やSMTP通信もできるので、フロントエンド言語に比べて汎用性が高いです。<br/>
'Let's start, everyone!'
EOD;
print $msg;
```

出力結果

![スクリーンショット 2019-08-11 20.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244639/1dd1784b-c2f6-8c76-a851-cf0cf8746748.png)

このように、エスケープせずとも、複数行を文字列リテラルにすることで、変数展開や``を気にせず使えます。便利ですね。
なお、EOD;の行に空白やタブ文字を含めるとエラーが起きるので注意。


###ヌル(null)
最後にnull型。
**ある変数が値を持たないことを意味し、唯一のリテラルとしてnullをもつ。**

次の条件で、変数はnullであると見なされる。

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

例

```php
$nullStr; //値が代入されていない
$nullStr2 = null; //nullを明示的に代入している
$nullStr3 = "nullではない"; // 文字列リテラルを代入
unset($nullStr3);  //$nullStr3をアンセット
print $nullStr3; //空なのでnull(表示されない)
```

次回は、phpの配列についても詳しくみていきます。