配列やオブジェクトを解り易い形式で出力

デバッグ時、よく「この変数の値ってどうなっているんだろう?」と思う事はよくあると思います。

文字列や数値であれば、echoで出力して確認すればよいですが、オブジェクトや配列ではそうはいきません。

そこで、オブジェクトや配列の内容を人間が見て解り易い形式で出力しましょう。

PHPにはそういった目的の為の関数がちゃんと準備されています。

print_r() 関数

公式ドキュメント

print_r ( mixed $expression [, bool $return = FALSE ] ) : mixed

第一引数に与えた変数の内容を人間が見て解り易い形式で出力します。

第二引数は省略可能で、trueを与えると、出力内容を文字列で結果として返します。例えば、Laravelでログ出力する場合は、

$result = print_r($obj, true);
\Illuminate\Support\Facades\Log::debug($result);

のようにするとログに出力できます。

配列を出力してみる

解説は苦手です。これを読んでるあなたもダラダラと書かれた解説を読むのは嫌いでしょう?百聞は一見に如かず。実行して結果を見てみましょう。まず配列を出力してみましょう。

以下のコードを実行します。

<?php
$array = [
  'a'
  , 'b'
];

echo $array . "\n\n";

print_r($array);
?>

実行結果。

$ php test_array.php 
Array

Array
(
    [0] => a
    [1] => b
)

echo $array は、配列という文字列しか出力しませんが、print_r($array) は、内容まで出力してくれます。

インスタンスを出力してみる

クラスを作成し、それを元に生成したインスタンスを出力してみましょう。

<?php
class Foo {
  private $privateStr = "private property.";

  public $publicStr = 'public property.';

  private function callPrivateMethod() {
    return "private method.";
  }

  public function callPublicMethod() {
    return "public method.";
  }
}

$foo = new Foo();
// echo $foo . "\n\n";
print_r($foo);

?>

実行結果。

$ php test_instance.php 
Foo Object
(
    [privateStr:Foo:private] => private property.
    [publicStr] => public property.
)

メソッドに関しては出力されませんが、インスタンス変数に関しては、スコープに関係なく出力してくれます。

17行目の echo $foo をコメントアウトすると、以下のエラーが発生します。

php test_instance.php 

Recoverable fatal error: Object of class Foo could not be converted to string in /Users/katsuya/test_instance.php on line 17

配列は Array と返してくれるんだし、インスタンスの場合は、内部で get_class() を実行して完全クラス名でも返してくれるといいのにと思わずにいられません。

おしまい

デバッグや調査で活用してください。