0
0

More than 1 year has passed since last update.

PHP独学ノート その6

Posted at

浮動小数点リテラル

浮動小数点リテラルは整数リテラルに比べると少し複雑。

一般的な「1.41421356」のような小数点数だけでなく、指数表現が存在するから。

<仮数部>e<符号><指数部>
の形式で表されるリテラルのこと。

<仮数部>×10の<符号><指数部>
で本来の小数値に変換できる。

一般的には非常に大きな(小さな)数値を表す為に利用する。

1.4142e101.4142×10の10乗
1412000000.0

1.173205e-71.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でもう少し詳しく

0
0
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
0
0