【PHP・デバッグ】PHPのデバッグに役立つ関数


##はじめに
はじめまして、プログラミング初学者のbookkuunです。
学んだことをQiitaでアウトプットしていきます。
記事に気になる点がありましたら、ご指摘・アドバイスよろしくお願いします。

今回は、PHPのデバッグについて整理していきます。

##対象者
- PHPを学び始めて間もない方
- PHPのデバッグ方法を整理したい方

##構成

- [デバッグとは？](#デバッグとは)
- [PHPのエラーの種類](#phpのエラーの種類)
- [デバッグ方法](#デバッグ方法)
    - [print_r](#print_r)
    - [var_dump](#var_dump)
    - [var_export](#var_export)
    - [error_log](#error_log)
- [まとめ](#まとめ)
- [おわりに](#おわりに)
- [参考資料](#参考資料)

##デバッグとは？
デバッグ（debug）とは、プログラムにあるバグや欠陥を発見し、正しく動作するようにするための作業です。

##PHPのエラーの種類

|  エラー  |  内容  |
| ---- | ---- |
|  Fatal error<br>（致命的なエラー） |  処理を継続することが不可能になった場合に発生します。  |
|  Parse error<br>（構文エラー）  |  コードの文法が誤っていることに発生します。  |
| Warning<br>（警告）  |  処理を継続することは可能。<br>想定外の問題が起こった時に発生します。  |
| Notice<br>（注意）  |  処理を継続することは可能。<br>想定内の問題に起こった時に発生します。  |

---

参考資料
[PHPエラー種類と原因 \- Qiita](https://qiita.com/Rys8/items/7293583be2771ee2e031)
[PHPのエラーの種類 \- Qiita](https://qiita.com/kyo_mizu/items/a1d185c7a32019b0f98c)
[基本中の基本！PHPのプログラミングエラーの種類と内容 \| 株式会社LIG](https://liginc.co.jp/programmer/archives/4107)

---
##デバッグ方法

###print_r

- 変数の値に関する情報を解り易い形式で表示します。(PHP マニュアル - Manual引用)
- 配列の表示が見やすいです。
- trueは1と表示されます。
- falseとNULLは何も表示されません。

コード例

```php
<?php

//整数
$number = 100;
print_r($number);

//文字列
$moji = "sample";
print_r($moji);

//真偽値
$shin = true;
$gi = false;
print_r($shin);
print_r($gi);

//NULL
$data = null;
print_r($data);

//配列など
$fruits = array('a' => 'apple', 'b' => 'banana', 'c' => array('orange', 'grape', 'strawberry'));
print_r($fruits);
```

出力（ブラウザ/&lt;pre&gt;タグを使用しています。）

```php
//$number（整数）
100

//$moji(文字列)
sample

//$shin(真偽値/true)
1

//$gi(真偽値/false)

//$data(NULL)

// $fruits（配列など）
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => orange
            [1] => grape
            [2] => strawberry
        )

)
```

###var_dump

- この関数は、指定した式に関してその型や値を含む構造化された情報を返します。(PHP マニュアル - Manual引用)
- `表示できる変数に指定はなく、数値や文字列、配列といった様々な型の変数の値`を確認することができます。
- データ型や構造など詳細な情報を表示するには、var_dump関数を使用します。

コード例

```php
<?php

//整数
$number = 100;
var_dump($number);

//文字列
$moji = "sample";
var_dump($moji); 

//真偽値
$shin = true;
$gi = false;
var_dump($shin);
var_dump($gi);

//NULL
$data = null;
var_dump($data);

//配列など
$fruits = array('a' => 'apple', 'b' => 'banana', 'c' => array('orange', 'grape', 'strawberry'));
var_dump($fruits);
```

出力（ブラウザ/&lt;pre&gt;タグを使用しています。）

```php
//$number（整数）
int(100)

//$moji（文字列）
string(6) "sample"

//$shin(真偽値/true)
bool(true)

//$gi(真偽値/false)
bool(false)

//$data(NULL)
NULL

//$fruits（配列など）
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  array(3) {
    [0]=>
    string(6) "orange"
    [1]=>
    string(5) "grape"
    [2]=>
    string(10) "strawberry"
  }
}
```


###var_export

-  渡された変数に関する構造化された情報を返します。この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。(PHP マニュアル - Manual引用)
- print_rと表示は似ています。var_dumpで見づらいときや文字列として出力したいときなどに活用できます。
- trueはtrueと表示されます。(print_rは1と表示されます。)
- falseとNULLはfalseとNULLとそのまま表示されます。（print_rはfalseとNULLは何も表示されません。）

コード例

```php
<?php

//整数
$number = 100;
var_export($number);

//文字列
$moji = "sample";
var_export($moji);

//真偽値
$shin = true;
$gi = false;
var_export($shin);
var_export($gi);

//NULL
$data = null;
var_export($data);

//配列など
$fruits = array('a' => 'apple', 'b' => 'banana', 'c' => array('orange', 'grape', 'strawberry'));
var_export($fruits);
```
出力（ブラウザ/&lt;pre&gt;タグを使用しています。）

```php
//$number（整数）
100

//$moji（文字列）
'sample'

//$shin(真偽値/true)
true

//$gi(真偽値/false)
false

//$data(NULL)
NULL

//$fruits(文字列など)
array (
  'a' => 'apple',
  'b' => 'banana',
  'c' => 
  array (
    0 => 'orange',
    1 => 'grape',
    2 => 'strawberry',
  ),
)
```

###error_log

- エラーメッセージを Web サーバーのエラーログあるいはファイルに送ります。(PHP マニュアル - Manual引用)
- エラーをログとして残したい時に使用します。

print_rとvar_exportは第2引数をtrueにすると返り値をとります。var_dumpは値を返しませんのでここでは活用できません。

コード例

```php
<?php
$fruits = ['a' => 'apple', 'b' => 'banana', 'c' => ['orange', 'grape', 'strawberry']];

//error_log(メッセージ, メッセージタイプ, 出力先)
//メッセージタイプ
//0の場合は標準出力など
//1の場合はメールの送付先アドレス
//3の場合は出力先ファイルパス

//print_rの場合
error_log(print_r($fruits, true), 3, "./print_r.txt");

//var_exportの場合
error_log(var_export($fruits, true), 3, "./var_export.txt");
```

ログファイル

```php:print_r.txt
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => orange
            [1] => grape
            [2] => strawberry
        )

)
```

```php:var_export.txt
array (
  'a' => 'apple',
  'b' => 'banana',
  'c' => 
  array (
    0 => 'orange',
    1 => 'grape',
    2 => 'strawberry',
  ),
)
```

##まとめ

- 配列の要素数やデータ型など細かい情報を確認したい場合はvar_dumpを使用します。
- print_rとvar_exportは似ているが、真偽値やNULLの表示が異なります。

出力表

|  データ型  |  値  | print_r | var_dump| var_export |
| ---- | ---- | ---- |---- |---- |
| 整数 | 123 | 123 | int(123) | 123 |
| 文字列 |  sample | sample | string(6) "sample" | 'sample' |
| 真偽値(true)  | true | 1 | bool(true) | true |
| 真偽値(false)  | false |  |bool(false)| false| 
| NULL  | null | | NULL | NULL |
| 配列など| ['apple', 'orange', 'grape'] | [0] => apple <br> [1] => orange  <br> [2] => grape | array(3) <br> { <br> [0]=> string(5) "apple" <br> [1]=> string(6) "orange" <br>  [2]=> string(5) "grape" <br>} | array <br> ( <br> 0 => 'apple', <br> 1 => 'orange', <br> 2 => 'grape',<br> )|

##おわりに
最後まで読んでいただきありがとうございます。print_rとvar_exportは似ていますがこのような違いがあったのですね。新たな発見でした。今後デバッグ関数を適切に活用し、エラー解決に活かしていきたいです。

##参考資料
[PHP マニュアル \- Manual](https://www.php.net/manual/ja/index.php)
[PHPエラー種類と原因 \- Qiita](https://qiita.com/Rys8/items/7293583be2771ee2e031)
[PHPのエラーの種類 \- Qiita](https://qiita.com/kyo_mizu/items/a1d185c7a32019b0f98c)
[基本中の基本！PHPのプログラミングエラーの種類と内容 \| 株式会社LIG](https://liginc.co.jp/programmer/archives/4107)
[var\_dump、var\_export、print\_r、デバッグ時に使うのがベストなのはどれ！？ \- Qiita](https://qiita.com/awesam86/items/1103079594fefc8e9f3f)
[print\_r\(\)とvar\_dump\(\)どちらをつかう？？](https://blue-goheimochi.hatenablog.com/entry/2013/09/29/print_r%28%29%E3%81%A8var_dump%28%29%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E3%81%A4%E3%81%8B%E3%81%86%EF%BC%9F%EF%BC%9F)