浮動小数点リテラル
浮動小数点リテラルは整数リテラルに比べると少し複雑。
一般的な「1.41421356」のような小数点数だけでなく、指数表現が存在するから。
<仮数部>e<符号><指数部>
の形式で表されるリテラルのこと。
<仮数部>×10の<符号><指数部>
で本来の小数値に変換できる。
一般的には非常に大きな(小さな)数値を表す為に利用する。
1.4142e10→1.4142×10の10乗→
1412000000.0
1.173205e-7→1.173205×10の-7乗→0.0000001173205
指数を表す「e」は大文字小文字を区別しないので「E」でも良い。
指数表現では、
1732を
「173.2e1」(173.2×10)、
「17.32e2」(17.32×10の2乗)、
「1.732e3」(1.732×10の3乗)のように複数のパターンで表現できてしまう。
そこで一般的には仮数部が「0.」+「0以外の数値」で始まるように表すことで表記を統一する。
この例であれば「0.1732e4」とする。
先頭のゼロは省略できるので、「.1732e4」としても同じ意味。
数値セパレーター(7.4)
PHP7.4以降では桁数の大きな数値の可読性を改善する為、数値リテラルの中に桁区切り文字(_)を記述できるようになった。
(数値セパレーター)以下はいずれも正しい数値リテラル。
$value = 1_234_567;
$pi = 3.141_592_653_59;
$num = 0.123_456e10;
日常的に利用する区切り文字の「,」でない理由は、PHPにおいてカンマはすでに別の意味を持っている為。
数値セパレーターはあくまで人間の可読性を助ける為の記号なので、自由に差し込む事ができる。
12_34_56 → 2桁ごとに区切り
12_345_6789 → 異なる桁での区切り
以下のように2、16進数でも利用できる。
0b01_01_01 → 10進数で21
0xf4_240 → 10進数で1000000
023_420 → 10進数で10000
ただし数値セパレーターを挿入できるのは数値の間のみ。
よって以下は不可。
123_456_789、123_456 → 数値の先頭/末尾
1._234 → 小数点の隣
0_x99 → 数値プレフィックスの途中
文字列リテラル
値そのものだけで表現する数値リテラルに対して、文字列リテラルを表すには文字列全体をシングルクォート(’)、またはダブルクォート(”)でくくる。
クォート文字で文字列の開始と終了を表す。
‘今HTMLとPHPでサイトを作る勉強中’
“なかなかうまくいかなくて泣きそう”
よって文字列リテラルには「’」「”」そのものを含めることはできない。以下は不可。
print “私の好きな食べ物は”カレー”です!”;
これだと「”私の好きな食べ物は”」と「”です!”」の間に不明な識別子カレーがあるとみなされてしまう。
その場合は、
文字列に含まれない方のクォートでくくる
print ‘私の好きな食べ物は“カレー”です!’;
今度は文字列の開始/終了を表すのはシングルクォートなので文字列にダブルクォートが含まれていても単なる「”」とみなされる。
逆も一緒。
print “あとは‘豚キムチ’も好きです!”;
クォート文字をエスケープ処理する
先ほどの方法では文字列にシングルクォート/ダブルクォート双方が含まれる場合に対処できない。
以下はエラーとなる。
print ‘単純’に”肉”は全般好きです!’;
このようなケースでは文字列に含まれるクォート文字をエスケープ処理する。
エスケープ処理とは「ある文脈の中で意味を持つ文字を、あるルールに基づいて無効化する(無意味にする)」ことをいう。
今回の例で「意味を持つ文字」とは、文字列リテラルの開始と終了を表すクォート文字である。
この例であれば、以下のように表すことでクォート文字をエスケープできる。
print ‘単純\’に”肉”は全般好きです!’;
「\’」は(文字列の開始と終了でない)ただの「’」とみなされるので意図した通り表示される。
同じく「\”」は文字列の開始と終了を意味しないただの「\”」になる。
よって以下のように書き換えても同じ意味。
print “単純‘に\”肉\”は全般好きです!”;
シングルクォート文字列とダブルクォート文字列の違い
PHPでは文字列リテラルをシングルクォートまたはダブルクォートのいずれでくくるかということには大きな違いがある。
具体例↓
<?php
$title = ‘死霊館シリーズ’;
$data1 = “怖かったホラー映画は「{$title}」です。<br>“;
$data2 = ‘怖かったホラー映画は「{$title}」です。<br>’;
print $data1;
//結果: 怖かったホラー映画は「死霊館シリーズ」です。
print $data2;
//結果: 怖かったホラー映画は「{$title}」です。
シングルクォートかダブルクォートのいずれでくくるかによって、文字列を解釈する方法が変化する。
その7でもう少し詳しく