Posted at

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

独習PHP第3版を学んでいるYUUKIです。

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


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


  • PHPは変数でデータ型をあまり意識しない

  • Java,C#のような言語は変数に数字をセット出来ないなどの制限がある


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


  • スカラー型 一つの変数に一つの値だけを扱うことができる


    • 論理型

    • 整数型

    • 浮動小数点型

    • 文字列型



  • 複合型 一つの変数に複数の値をまとめて扱える


    • 配列型

    • オブジェクト型



  • 特殊型 スカラー型にも複合型にも属さない


    • リソース型

    • ヌル型




リテラルとは

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


論理リテラル(bool)


  • 真(true)が偽(false)のいずれかの状態しか持たない

  • true、falseは大文字小文字を区別しない。(TRUE,FALSEでも通る)

PHPでFalseとみなす状況

- 空文字列、または文字列の0

- 整数リテラルの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

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

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

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


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

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

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

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

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

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

これでOK。

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


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

PHPのダブルクォーテーション("")とシングルクォーテーション('')の違いを理解する


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

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

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

$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

このように、エスケープせずとも、複数行を文字列リテラルにすることで、変数展開や``を気にせず使えます。便利ですね。

なお、EOD;の行に空白やタブ文字を含めるとエラーが起きるので注意。


ヌル(null)

最後にnull型。

ある変数が値を持たないことを意味し、唯一のリテラルとしてnullをもつ。

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


  • 変数に値が代入されていない

  • 変数に明示的にnullが代入された場合

  • unset命令で変数の内容が破棄された場合

$nullStr; //値が代入されていない

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

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