【PHP入門講座】 型変換

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

この内容は次の「演算子」に掲載したいところでしたが、あまりにも内容が膨大になるので専用の回を設けることにしました。

# キャスト(型変換)演算子とは

変数や値の **頭** につけることで、指定された型に強制的に変換するものです。大文字小文字は区別されません。

```php:PHPコード
var_dump((int)'123');
```

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

# `(string)`

文字列型への変換を行います。同様の役割を `strval` 関数も担っています。

**strval**
http://php.net/manual/ja/function.strval.php

## 整数

- そのまま文字列になります。

## 浮動小数点数

- 小数部分で `0` が続いているところは省略される
- ある範囲を超過すると **科学表記** が強制される
- `NAN` や `INF` はそのまま文字列に

```php:PHPコード
var_dump(
    (string)-1.1,
    (string)1.0,
    (string)999999999999.0,
    (string)INF
);
```

```text:実行結果
string(4) "-1.1"
string(1) "1"
string(7) "1.0E+20"
string(3) "INF"
```

## `TRUE` `FALSE` `NULL`

`FALSE` の扱いが配列キー上の変換規則と異なることに注意してください。

- `TRUE` → `"1"`
- `FALSE` `NULL` → `""`

## 配列

- `"Array"` ( **Notice** を発生)

## オブジェクト

**※ この項目には未学習の内容が含まれています。**

- マジックメソッド **`__toString`** が実装されている場合、その返り値
- 実装されていない場合は **Catchable Fatal Error** が発生

## リソース

- `"Resource id #番号"` の形式

# `(int)` `(integer)`

整数型への変換を行います。同様の役割を `intval` 関数も担っていますが、こちらは第2引数を指定すればさらに違った使い方が出来ます。ここではリンクだけの紹介とさせていただきます。

**intval**
http://php.net/manual/ja/function.intval.php

## 文字列

- 左から<ins>整数として</ins>有効な文字が続く分だけが対象
- 空文字列 → `0`

```php
var_dump(
    (int)'+1.8',      // int(1)
    (int)'++1.8',     // int(0)
    (int)'5 pencils', // int(5) 
    (int)'1e2x',      // int(1)
    (int)'1e2'        // int(1)
);
```

## 浮動小数点数

- **切り捨て** を行う
- <ins>精度が失われ、想定していない値になることがあるので注意</ins>

```php:PHPコード
var_dump(
    (0.1 + 0.7) * 10,
    (int)((0.1 + 0.7) * 10)
);
```

```text:実行結果
float(8)
int(7)
```

- **`NAN` → `-2147483648`** (32ビット環境)
- **`INF` → `0`**

## `TRUE` `FALSE` `NULL`

- `TRUE` → `1`
- `FALSE` `NULL` → `0`

## 配列

- 要素数1以上 → `1`
- 要素数0 → `0`

## オブジェクト

- `1` ( **Notice** を発生)

## リソース

- リソースID

# `(float)` `(double)`

浮動小数点数型への変換を行います。同様の役割を `floatval` 関数と `doubleval` 関数も担っています。

## 文字列

- 左から<ins>浮動小数点数として</ins>有効な文字が続く分だけが対象
- `0` を省略して小数点からの記述も認められる
- **科学記法** も認められる
- 空文字列 → `0.0`

```php
var_dump(
    (float)'90% OFF sale', // float(90.0)
    (float)'.1',           // float(0.1)
    (float)'-.1',          // float(-0.1)
    (float)'1e2x',         // float(100)
    (float)'1e2'           // float(100)
);
```

## 整数

- `整数.0` の形式

## `TRUE` `FALSE` `NULL`

- `TRUE` → `1.0`
- `FALSE` `NULL` → `0.0`

## 配列

- 要素数1以上 → `1.0`
- 要素数0 → `0.0`

## オブジェクト

- `1.0` ( **Notice** を発生)

## リソース

- `番号.0` の形式

# `(bool)` `(boolean)`

論理型への変換を行います。同様の役割を `boolval` 関数も担っています(PHP5.5以降)。

**boolval**
http://php.net/manual/ja/function.boolval.php

## 文字列

- `"0"` と `""` → `FALSE`
- それ以外 → `TRUE`

```php
var_dump(
    (bool)'0',     // FALSE
    (bool)'',      // FALSE
    (bool)'0.0',   // TRUE
    (bool)'00',    // TRUE
    (bool)'-0',    // TRUE
    (bool)'true',  // TRUE
    (bool)'false'  // TRUE
);
```

## 整数・浮動小数点数

- `0` `0.0` → `FALSE`
- それ以外 → `TRUE`

```php
var_dump(
    (bool)0,   // FALSE
    (bool)0.0, // FALSE
    (bool)-0,  // FALSE
    (bool)1,   // TRUE
    (bool)-1,  // TRUE
    (bool)INF, // TRUE
    (bool)NAN  // TRUE
);
```

## `NULL`

- `FALSE`

## 配列

- 要素数1以上 → `TRUE`
- 要素数0 → `FALSE`

## オブジェクト・リソース

- `TRUE`

# `(array)`

配列型への変換を行います。

## 文字列 整数 浮動小数点数 `TRUE` `FALSE` リソース

- キー `0` に対する代入と等価

```php:PHPコード
var_dump((array)false);
```

```text:実行結果
array(1) {
  [0]=>
  bool(false)
}
```

## `NULL`

- 要素数0の配列

## オブジェクト

**※ この項目には未学習の内容が含まれています。**

### 【要注意】

全てのプロパティが連想配列形式で格納されます。値はそのままですが、キーがかなり変則的です。新しく代入されるキーを `$key` 、もとのプロパティ名を `$property_name` とすると、下記のような結果になります。

#### `public`

```php
$key = $property_name;
```

#### `private`

```php
$key = "\0" . __CLASS__ . "\0" . $property_name; 
```

#### `protected`

```php
$key = "\0" . '*' . "\0" . $property_name; 
```

# `(object)`

**※ この項目には未学習の内容が含まれています。**

基本クラス `stdClass` 型への変換を行います。

## 文字列 整数 浮動小数点数 `TRUE` `FALSE` リソース

- `public` プロパティ **`scalar`** に対する代入と等価

```php:PHPコード
var_dump((array)false);
```

```text:実行結果
object(stdClass)#1 (1) {
  ["scalar"]=>
  bool(false)
}
```

## `NULL`

- 初期状態の `stdClass`

## 配列

- キーと値が全て `public` プロパティとしてセットされる

### 【要注意】 名前が整数型のプロパティ・・・？

オブジェクトのプロパティ名は基本的には **文字列型** に限定されています。ところが、この `(object)` キャストによる場合でのみ、何と<ins>プロパティ名を整数型にできてしまいます</ins>。こうして作られたプロパティには<ins>アロー演算子でアクセスすることは出来ません</ins>。

```php:PHPコード
$obj = (object)array('A');
$obj->{'0'} = 'B';
var_dump($obj);
$obj->{0} = 'C';
var_dump($obj);
```

```text:実行結果
object(stdClass)#1 (2) {
  [0]=>
  string(1) "A"
  ["0"]=>
  string(1) "B"
}
object(stdClass)#1 (2) {
  [0]=>
  string(1) "A"
  ["0"]=>
  string(1) "C"
}
```