【PHP入門講座】 数値・論理値・リソース

### [目次に戻る](http://qiita.com/mpyw/items/752e19a578cf7d96fc5f)

# 数値

数値は更に以下の2つがあります。

- 整数(int, integer)
- 浮動小数点数(float, double)

順番に見ていきましょう。

## 整数

- **int** と **integer** は同じ意味ですが、前者の方がよく用いられます。大文字小文字の区別はありません。
- 実際には<ins>全て10進数として管理</ins>されますが、コード上では16進数・8進数・2進数(PHP5.4以降のみ)で表記することも出来ます。16進数では `0x` 、8進数では `0` 、2進数では `0b` を頭につけます。大文字小文字の区別はありません。

```php:PHPコード
var_dump(23);      // 10進数表記
var_dump(0x17);    // 16進数表記
var_dump(027);     // 8進数表記
var_dump(0b10111); // 2進数表記(PHP5.4以降のみ)
```

```text:実行結果
int(23)
int(23)
int(23)
int(23)
```

- 符号をつけることも出来ます。`23` と `+23` は同値です。

```php:PHPコード
var_dump(+23, -23);
```

```text:実行結果
int(23)
int(-23)
```

- 自分の環境での最大値は定数 **`PHP_INT_MAX`** によって自動的に定義されています。
- 具体的に扱える範囲は下記のようになります。

| | 32ビット環境 | 64ビット環境 |
|:---:|:---:|:---:|
| 最小値 | -2147483648 | -9223372036854775808 |
| 最大値 | +2147483647 | +9223372036854775807 |

- 最小値を下回る・最大値を超える計算や整数以外の数と演算を行った、つまり<ins>整数でデータを維持出来なくなった</ins>とき、次に紹介する **浮動小数点数** に自動的に変換されます。

```php:PHPコード
var_dump(PHP_INT_MAX, PHP_INT_MAX + 1);
```

```text:64ビット環境での実行結果
int(9223372036854775807)
float(9223372036854775808)
```

## 浮動小数点数

### 浮動小数点数の予備知識

浮動小数点数はやや難解で、これが完璧に理解できなくてもPHPの学習にはほとんど差支えが無いので、ここでは<ins>ざっくりと</ins>解説します。正確な情報が欲しい方はWikipediaをお読みください。

**Wikipedia - 浮動小数点数**
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

中学や高校で習った **科学記法** を思い出してください。

例： ファラデー定数
$9.65 × 10^{4} \mbox{C}/\mbox{mol}$

この考え方はまさに **浮動小数点数** そのものであるとも言えます。実際には **基数** である `10` は `2` に変換されて管理されていますが、考え方はほとんど同じです。 **「有効数字$n$桁まで計算しなさい」** のような問題、ありましたよね。この有効数字部分のことを **仮数** と呼ぶのです。32ビットの仮数精度を持つタイプのものに `float`、その倍の64ビットの仮数精度を持つタイプのものに `double` という名前が付けられています。

### PHPにおける浮動小数点数

- **float** と **double** は同じ意味ですが、前者の方がよく用いられます。

他のプログラミング言語と同じようにPHPの浮動小数点型には `single` `double` の2種類がある・・・・・・ように思えますが、<ins>実際には全て `double`</ins> です。名前が2種類ついているだけで、実体は全く同じです。これには ***歴史的な理由*** があるようです。気持ち悪い屁理屈に聞こえますが、PHPにおいてこの屁理屈はこれから先何回か遭遇することになると思うので、割り切っていきましょう。<del>PHPはそういう気持ち悪い面をたくさん持った出来損ないの言語です。</del>

**PHPマニュアルから見つかる** ***歴史的な理由***
https://www.google.co.jp/search?hl=ja&q=site:php.net%20%E6%AD%B4%E5%8F%B2%E7%9A%84%E3%81%AA%E7%90%86%E7%94%B1

- 一般的な表し方です。

```php:PHPコード
var_dump(1.45, -1.0, 0.0);
```

```text:実行結果
float(1.45)
float(-1.0)
float(0.0)
```

- 科学記法を使った例です。 `e` または `E` 以降に基数 `10` を何乗するかを続けます。

```php:PHPコード
var_dump(9.6485e4);  // ファラデー定数
var_dump(8.9876e-9); // クーロン定数
```

```text:実行結果
float(96485)
float(8.9876E-9)
```

### 非数値(NAN, Not a Number)

PHPで一部の演算を行ってしまった時に、結果が **非数値** になることがあります。

- この値は定数 `NAN` によって定義されています。<ins>定数なので大文字小文字は区別されます。</ins>
- `NAN` と何を演算しても結果は `NAN` になります。
- `NAN` と他の何を比較しても結果は`FALSE` になります。
- <ins>`NAN` と `NAN` を比較しても結果は`FALSE` になります。</ins>
- ある値が `NAN` であるか調べるには `is_nan` 関数を使う方法1つしかありません。

```php:PHPコード
var_dump(asin(1.1)); // アークサインの定義域は-1から1の間
```

```text:実行結果
float(NAN)
```

### 無限大(INF, Infinite, ∞)

PHPで浮動小数点数が膨大、具体的には約 $1.8 × 10 ^{308}$ 以上の値になると、その数は **無限大** に変換されます。

- この値は定数 `INF` によって定義されています。<ins>定数なので大文字小文字は区別されます。</ins>
- 一度 `INF` になってしまったものをもとの数に戻すことは出来ません。
- マイナス無限大も存在します。

```php:PHPコード
var_dump(-1 * INF);
```

```text:実行結果
float(-INF)
```

- `INF` を用いた際の計算法則は数学界のものに従います。

```math
\frac{1}{\mbox{INF}} = 0 \\
{\mbox{INF}} \cdot {\mbox{INF}} = \mbox{INF} \\
\frac{\mbox{INF}}{\mbox{INF}} = \mbox{NAN}
```
- `1 / 0` や `INF / 0` の結果も `NAN` になると予測されますが、実際には<ins>Warningを発生して `FALSE`になります</ins>。これにも ***歴史的な理由*** があると思われます。

```math
\frac{1}{0} = \mbox{FALSE with Warning: Division by zero} \\
\frac{\mbox{INF}}{0} = \mbox{FALSE with Warning: Division by zero}
```

# 論理値

さっきから何回か `FALSE` と出てきましたが、これは2つある論理値のうちの1つです。論理値とは、ある事柄 **(命題)** に関して、それが成り立つか **(真)**、成り立たないか **(偽)** を表すものです。

- 真を `TRUE` 、偽を `FALSE` で表します。大文字小文字の区別はありません。
- if文などでの条件判定には論理値が用いられます(論理値で無い場合には自動変換されます)。

```php:PHPコード
<?php

// 私は一人ぼっちか？
$i_am_alone = true;
var_dump($_am_alone);

//　クリスマスの行方は・・・
if ($i_am_alone) {
    echo 'Fu*king Christmas!!';
} else {
    echo 'Enjoy Happy Christmas!!';
}
```

```text:実行結果
bool(true)
Fu*king Christmas!!
```

# リソース

**プログラミングにおける「リソース」の意味**
http://e-words.jp/w/E383AAE382BDE383BCE382B9.html

PHPにおける「リソース」とは、PHPであらかじめ用意されている関数(標準関数)が作成した特別なデータという意味になります。リソース自体を直接プログラマが書き換えることは出来ません。<ins>リソースを専用の関数に渡して使う</ins>という流れになります。

次のコードを実行してみましょう。

```php
<?php

// shout.txtへのファイルポインタ(ストリーム)リソースを書き込みモード(w)で開く
$fp = fopen('shout.txt', 'w');

// データを書き込む
fwrite($fp, 'Fu*king Christmas!!');

// ファイルポインタ(ストリーム)リソースを解放する
fclose($fp);
```

PHPファイルが置かれたディレクトリに `shout.txt` が作成されます。しっかり `Fu*king Christmas!!` と書き込まれているかどうかも開いて確認してみてください。

また、`$fp` をダンプすると下記のような結果が得られます。

```text
resource(1) of type (stream)
```

- この `1` は **リソースID** といい、PHPコード実行中1番目に作られたリソースであることを表します。
- この `stream` はリソースの種類を表しています。