1. 変数の中身確認
  2. 標準エラー出力
    • エラーログ

      変数の中身確認

      PHPで変数に入っている配列やオブジェクトなどの中身を確認する場合、以下のような関数を使います。

      この2つの違いは、変数の型情報の有無と、結果の戻り値の有無になります。 var_dump()が変数の型情報有り、戻り値無しに対して、print_r()は変数の型情報は無し、結果の戻り値有りです。

      確認テストでは以下のクラスを使用しました。

      class Fruit {
          private $name = 'fruit';
          protected $color = array(
              'red' => 0,
              'green' => 0,
              'blue' => 0,
          );
          public $comment = 'nothing';
      
          public function getName() {
              return $this->name;
          }
       }

      • var_dump

      • var_dump (PHPマニュアル)

        var_dump()関数は、引数として与えた配列、オブジェクトなどの中身の詳細情報を表示してくれます。 ただし、結果は関数の戻り値にならないので、結果を変数に代入したいときは、出力バッファを制御する必要があります。

        <?php
        $obj = new Fruit();
        var_dump($obj);
        この実行結果は以下のようになります。
        object(Fruit)#1 (3) {
          ["name":"Fruit":private]=>
          string(5) "fruit"
          ["color":protected]=>
          array(3) {
            ["red"]=>
            int(0)
            ["green"]=>
            int(0)
            ["blue"]=>
            int(0)
          }
          ["comment"]=>
          string(7) "nothing"
        }

        var_dump()の結果をログ出力したり、変数に代入したい場合、出力バッファの制御が必要になります。 その場合、ob_start()、ob_get_contents()、ob_end_clean()関数などを使い、出力を表示せずに内部バッファに一旦保存し、 その内容を変数に代入したりします。

        <php
        print("***1***\n");
        
        ob_start();                 // 出力を表示せずに内部バッファに保存するように変更
        
        var_dump($obj);             // var_dump($obj)の出力は内部バッファに保存されます。
        
        $a = ob_get_contents();     // 内部バッファの内容を変数に代入。この例ではvar_dump($obj)の結果
        
        ob_end_clean();             // 出力をクリア後、出力を内部バッファに保存しないように変更
        
        print("***2***\n");
        print("\$a => $a\n");
        print("***3***");
        ***1***
        ***2***
        $a = object(Fruit)#1 (3) {
          ["name":"Fruit":private]=>
          string(5) "fruit"
          ["color":protected]=>
          array(3) {
            ["red"]=>
            int(0)
            ["green"]=>
            int(0)
            ["blue"]=>
            int(0)
          }
          ["comment"]=>
          string(7) "nothing"
        }
        ***3***

        参考 PHP manual

      • print_r

      • print_r (PHPマニュアル)

        var_dump()と同様に、配列やオブジェクトの中身を知りたい場合に使用します。型情報が無い分、var_dump()より表示行が少し減ります。

        <?php
        $obj = new Fruit();
        print_r($obj);
        この実行結果は以下のようになります。
        Fruit Object
        (
            [name:Fruit:private] => fruit
            [color:protected] => Array
                (
                    [red] => 0
                    [green] => 0
                    [blue] => 0
                )
        
            [comment] => nothing
        )				

        print_r()はvar_dump()と違って、結果を出力バッファに出力するだけでなく、結果を文字列として関数の戻り値にすることができます。 この場合、第二引数にtrueを指定します。

        <?php
        $obj = new Fruit();
        $s = print_r($obj, true);
        echo "Fruit objectの中身は\n" .$a ."になります。\n";
        これを実行すると、変数$s にprint_r()の結果が代入されます。 これは以下のような、知りたい変数の情報をExceptionのメッセージに追加したり、ログに出力する場合に使ったりしています。
        <?php
        try {
            if (empty($test)) {
                throw new Exception("\$test is empty.\n" . print_r($obj, TRUE));
            }
        } catch (Exception $e) {
            print($e->getMessage());
        }
        これを実行すると、以下のようになります。Exceptionのメッセージにオブジェクト情報を含めると、デバッグやExceptionの原因究明を助ける場合があります。
        $test is empty.
        Fruit Object
        (
            [name:Fruit:private] => fruit
            [color:protected] => Array
                (
                    [red] => 0
                    [green] => 0
                    [blue] => 0
                )
        
            [comment] => nothing
        )

      標準エラー出力

      デバッグ出力を標準出力でなく、標準エラーに出力したい場合があります。 そのような場合、以下のようにSTDERRとfwrite関数を使用して標準エラーに出力できます。

      fwrite(STDERR, print_r($a, TRUE));

        エラーログ

        PHPでは設定によってエラー出力をログファイルに出力することができます。

        log_errorsを1にセットすると、エラーメッセージを、サーバーのエラーログまたは指定したログファイルに出力します。 error_logでは出力するログファイルのパスが指定できます。

        >?php
        error_reporting(E_ALL);
        ini_set("log_errors", 1);     // エラーメッセージの出力を指定
        ini_set("error_log", "/tmp/php_error.log");  // エラーメッセージの出力ファイルを指定
        
        $a = 0;
        $b = 10;
        print "a: $a  b:$b\n";
        print $b/$a;
        print "\n";

        ログファイル/tmp/php_error.logへの出力は以下のようになります。

        [27-Jan-2015 21:56:17] PHP Warning:  Division by zero in /home/mikan/git/prog/php
        /basic/error_log/test.php on line 13
        [27-Jan-2015 21:56:17] PHP Stack trace:
        [27-Jan-2015 21:56:17] PHP   1. {main}() /home/mikan/git/prog/php/basic/error_log
        /test.php:0