LoginSignup
2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-11

近況報告

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

独習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の配列についても詳しくみていきます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1