こんにちはフロントエンドエンジニアのまさにょんです!
今回は、PHPでの開発・デバッグに役立つ出力系統の関数について解説していきます。
取り上げるのは、print_r, var_dump, var_export の3つのメソッドです。
この3つの違いと使い方について解説していきます。
ぜひこれらを使い分けて開発・デバッグを進めていきましょう!
また以前に、PHPの標準出力機能である echo と printの違いと使い方について解説しました。
気になる方は、こちらもぜひCheckしてみてください。
目次
- 1 print_rとは?
- 2 var_exportとは?
- 3 var_dumpとは?
- 4 print_r と var_dump と var_export の出力結果の違いを比較する
- 5 print_r と var_dump と var_export の使い分けポイント
- 6 print_r の配列, 連想配列, Objectの出力結果
- 7 var_dump の配列, 連想配列, Objectの出力結果
- 8 var_export の配列, 連想配列, Objectの出力結果
- 9 【おまけ】PHPでconsole.log()を使用する(JavaScript活用事例)
- 10 Twitterやってます!Follow Me!
- 11 PHP / Laravel書籍
- 12 参考・引用
- 13 最近の投稿
print_rとは?
PHP-Manualでそれぞれの関数に関する情報を確認していきます。
まずは、print_r() から確認していきます。
print_r — 指定した変数に関する情報を解りやすく出力する
print_r(mixed
$value
, bool$return
=false
): string|boolprint_r() は、 変数の値に関する情報を解り易い形式で表示します。
print_r()、var_dump() および var_export() は、オブジェクトの protected および private のプロパティも表示します。 static が付いたクラスメンバーは表示されません。
[ パラメータ ]
value : 表示したい式。
return : print_r() の結果を取得したい場合には
return
引数を使います。この引数が
true
の場合には、 print_r() は情報を表示するかわりに情報を返します。[ 戻り値 ]
string、int, float を指定した場合はその値が出力されます。
array を指定した場合、キーと要素を表す形式で値が 表示されます。
object に関しても同様の表示形式となります。
return
パラメータがtrue
の場合は、 この関数は string を返します。それ以外の場合の戻り値は
引用元: print_r – Manual – PHPtrue
です。
ポイントは、第二引数に「 true 」(returnパラメータ)を設定すると、出力の代わりに戻り値が返される点です。
<?php
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
// 1. 第二引数に「 true 」(returnパラメータ)を設定
$print_return = print_r($array, true);
echo 'print_r() の return文字列を出力します'. "\n";
echo $print_return . "\n";
// 2. 第二引数は設定せずに標準出力する
print_r($array2);
echo "\n";
// [ 実行結果 ]
// print_r() の return文字列を出力します
// Array
// (
// [0] => robotama
// [1] => ロボ玉
// [2] => ロボ玉試作1号機
// )
// Array
// (
// [type] => robotama
// => ロボ玉試作1号機
// [power] => 1000
// [robotama_flag] => 1
// )
var_exportとは?
次に、var_export() の情報を確認していきます。
第二引数に「 true 」(returnパラメータ)を設定すると、出力の代わりに戻り値が返される点は、print_r()と共通です。
ただprint_r() と違う点は、返される値が有効なPHPコードである点です。
また、var_export()の有効なPHPコードであると言う特性により、出力される結果が実際のPHPデータの形のままでわかりやすい点も特徴です。
個人的には、より簡単にデータ構造を確認したい時は、var_export() を使って、さらに細かい情報を知りたい時は、後述する var_dump() を使用するようにしています。
var_export — 変数の文字列表現を出力または返す
var_export(mixed
$value
, bool$return
=false
): ?stringvar_export() は、 渡された変数に関する構造化された情報を返します。
この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。
[ パラメータ ]value : エクスポートしたい変数
return : 使用されかつ
[ 戻り値 ]true
に設定された場合、var_export() は変数表現を出力する代わりに返します。
return
パラメータが使用されtrue
と評価される場合、 変数表現を返します。そうでない場合、この関数は
引用元: var_export – Manual – PHPnull
を返します。
<?php
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
// 1. 第二引数に「 true 」(returnパラメータ)を設定
$export_value = var_export($array, true);
echo 'var_export() の return文字列を出力します'. "\n";
echo $export_value . "\n";
// 2. 第二引数は設定せずに標準出力する
var_export($array2);
echo "\n";
// [ 実行結果 ]
// var_export() の return文字列を出力します
// array (
// 0 => 'robotama',
// 1 => 'ロボ玉',
// 2 => 'ロボ玉試作1号機',
// )
// array (
// 'type' => 'robotama',
// 'value' => 'ロボ玉試作1号機',
// 'power' => 1000,
// 'robotama_flag' => true,
// )
var_dumpとは?
最後に var_dump() の情報を確認していきます。
var_dump — 変数に関する情報をダンプする
var_dump(mixed
$value
, mixed...$values
): voidこの関数は、指定した式に関してその型や値を含む構造化された情報を 返します。
配列の場合、その構造を表示するために各値について再帰的に 探索されます。
オブジェクトのすべての public、private および protected なプロパティが出力されます。
ただし、そのオブジェクトが __debugInfo() メソッド を実装している場合は、その限りではありません。
[ パラメータ ]value : ダンプしたい変数。
values : ダンプしたい追加の変数。
[ 戻り値 ]値を返しません。
引用元: var_dump – Manual – PHP
print_r() や var_export() と違って var_dump() は戻り値を返しません。
var_dump() はデータの情報を詳しく確認するのに適した関数です。
次のSampleCodeを見ても分かるとおり、print_r() や var_export() とは違って、
データの型の情報や配列のlengthなども記載されており、出力される情報量が多いです。
<?php
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
var_dump($array);
var_dump($array2);
// [ 実行結果 ]
// array(3) {
// [0]=>
// string(8) "robotama"
// [1]=>
// string(9) "ロボ玉"
// [2]=>
// string(22) "ロボ玉試作1号機"
// }
// array(4) {
// ["type"]=>
// string(8) "robotama"
// ["value"]=>
// string(22) "ロボ玉試作1号機"
// ["power"]=>
// int(1000)
// ["robotama_flag"]=>
// bool(true)
// }
print_r と var_dump と var_export の出力結果の違いを比較する
3つの出力関数の出力結果の違いを並べてみると、次のとおりです。
<?php
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
print_r($array2);
// 1. print_r 出力結果
// Array
// (
// [type] => robotama
// => ロボ玉試作1号機
// [power] => 1000
// [robotama_flag] => 1
// )
var_export($array2);
// 2. var_export 出力結果
// array (
// 'type' => 'robotama',
// 'value' => 'ロボ玉試作1号機',
// 'power' => 1000,
// 'robotama_flag' => true,
// )
// 2-1. 出力可能な形で
var_dump($array2);
// 3. var_dump 出力結果
// array(4) {
// ["type"]=>
// string(8) "robotama"
// ["value"]=>
// string(22) "ロボ玉試作1号機"
// ["power"]=>
// int(1000)
// ["robotama_flag"]=>
// bool(true)
// }
// [ Point ]
// 3-1. 配列の要素数やデータ型などの詳細も出力される!
print_r と var_dump と var_export の使い分けポイント
次にこの3つのメソッドの使い分けのポイントを見ていきましょう。
- データ型や配列の要素数などを細かく確認したい場合は var_dump
- シンプルに配列のkey&valueだけを確認したい場合は、var_export か print_r
- 変数に代入したい場合は var_export か print_r
個人的には、基本的なデータの確認は、var_export() を使用して、データの詳細を知りたい場合は、var_dump() を使用する方針でいます。
ログファイルに出力する場合は、var_export() か print_r()
もちろん、標準出力の代わりに変数に値を返却できるvar_export() と print_r() は、それを外部ファイルに出力するような実装をすることができます。
PHPの標準関数のerror_log関数を利用して次のように実装することができます。
<?php
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
//var_exportの場合
error_log(var_export($array2, true), 3, "./debug.txt");
//print_rの場合
error_log(print_r($array2, true), 3, "./debug.txt");
print_r の配列, 連想配列, Objectの出力結果
3つのメソッドの違いがわかったところで、ここからは各メソッドの出力結果を細かくみていきます。
print_r での配列, 連想配列, Objectでの出力結果を見てみましょう。
<?php
// [ print_r-基本構文 ] print_r(mixed $value, bool $return = false): string|bool
// Sample-Data-1: 配列
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];
// Sample-Data-2: 連想配列
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
// Sample-Data-3: CastしたObject (stdClass)
$object = (object)[
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
class Robotama {
public $name = 'ロボ玉';
public $robotama_flag = true;
public function hello() {
echo 'ロボ玉なのだ!';
}
}
// Sample-Data-4: 自前で用意したClassから作成したObject
$robotamaInstance = new Robotama;
// それぞれ出力してみます。
print_r($array);
print_r($array2);
print_r($object);
print_r($robotamaInstance);
Array
(
[0] => robotama
[1] => ロボ玉
[2] => ロボ玉試作1号機
)
Array
(
[type] => robotama
=> ロボ玉試作1号機
[power] => 1000
[robotama_flag] => 1
)
stdClass Object
(
[type] => robotama
=> ロボ玉試作1号機
[power] => 1000
[robotama_flag] => 1
)
Robotama Object
(
[name] => ロボ玉
[robotama_flag] => 1
)
var_dump の配列, 連想配列, Objectの出力結果
var_dump での配列, 連想配列, Objectでの出力結果を見てみましょう。
// [ var_dump-基本構文 ] var_dump(mixed $value, mixed ...$values): void
// Sample-Data-1: 配列
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];
// Sample-Data-2: 連想配列
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
// Sample-Data-3: CastしたObject (stdClass)
$object = (object)[
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
class Robotama {
public $name = 'ロボ玉';
public $robotama_flag = true;
public function hello() {
echo 'ロボ玉なのだ!';
}
}
// Sample-Data-4: 自前で用意したClassから作成したObject
$robotamaInstance = new Robotama;
// それぞれ出力してみます。
var_dump($array);
var_dump($array2);
var_dump($object);
var_dump($robotamaInstance);
array(3) {
[0]=>
string(8) "robotama"
[1]=>
string(9) "ロボ玉"
[2]=>
string(22) "ロボ玉試作1号機"
}
array(4) {
["type"]=>
string(8) "robotama"
["value"]=>
string(22) "ロボ玉試作1号機"
["power"]=>
int(1000)
["robotama_flag"]=>
bool(true)
}
object(stdClass)#1 (4) {
["type"]=>
string(8) "robotama"
["value"]=>
string(22) "ロボ玉試作1号機"
["power"]=>
int(1000)
["robotama_flag"]=>
bool(true)
}
object(Robotama)#2 (2) {
["name"]=>
string(9) "ロボ玉"
["robotama_flag"]=>
bool(true)
}
var_export の配列, 連想配列, Objectの出力結果
var_export での配列, 連想配列, Objectでの出力結果を見てみましょう。
// [ var_export-基本構文 ] var_export(mixed $value, bool $return = false): ?string
// Sample-Data-1: 配列
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];
// Sample-Data-2: 連想配列
$array2 = [
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
// Sample-Data-3: CastしたObject (stdClass)
$object = (object)[
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
];
class Robotama {
public $name = 'ロボ玉';
public $robotama_flag = true;
public function hello() {
echo 'ロボ玉なのだ!';
}
}
// Sample-Data-4: 自前で用意したClassから作成したObject
$robotamaInstance = new Robotama;
// それぞれ出力してみます。
var_export($array);
var_export($array2);
var_export($object);
var_export($robotamaInstance);
array (
0 => 'robotama',
1 => 'ロボ玉',
2 => 'ロボ玉試作1号機',
)
array (
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
)
(object) array(
'type' => 'robotama',
'value' => 'ロボ玉試作1号機',
'power' => 1000,
'robotama_flag' => true,
)
Robotama::__set_state(array(
'name' => 'ロボ玉',
'robotama_flag' => true,
))
【おまけ】PHPでconsole.log()を使用する(JavaScript活用事例)
ここからは、おまけ編です。
JavaScript使いには馴染みの深いconsole.log()をPHPで使用したいときに次のようなCodeが使えます!
ポイントは、引数に渡されるデータを出力するために「json_encode()」でJSON形式に変換しているところです。
<?php
// < おまけ: PHPでconsole.log()を使用する(JavaScript活用事例) >
// 1. 自前で console_log関数を作る!
function console_log($data){
// 2. 中身は、script-Tag & PHP から JavaScriptにデータを受け渡すためのJSON文字列
echo '<script>';
echo 'console.log(' . json_encode($data) . ')';
echo '</script>';
}
$array = array('ロボ玉', 'ももちゃん', '白桃');
console_log($array);
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!
PHP / Laravel書籍
参考・引用
- 型宣言 – Manual – PHP
- print_r – Manual – PHP
- var_dump – Manual – PHP
- var_export – Manual – PHP
- [PHP] print_r、var_dump、var_export のちがい
- var_dump、var_export、print_r、デバッグ時に使うのがベストなのはどれ!?
- 【PHP入門】配列の中身を表示する|var_dump・print_r・var_export
- 【PHP】console.logを使ってデバッグログを出力する方法