こんばんは!
ゆうです。
今回は
「デバッグで使う関数」
についてお伝えします。
初心者の方にありがちなのですが
デバッグを行う際、全て表示に
「echo」を用いていませんか?
この方法ではあらゆるものが
文字列 に変換されて表示されているんです。
しかし、中には文字列に変換せずに
もとの形のままの情報を得たい時も出てきます。
そこでよく使われるデバッグ用の関数、
var_dump の登場です。
この関数を知っているのと知らないので
作業効率が大きく変わる
こともあります。
まずは最も基本的な例から。
整数をダンプしてみましょう。
この関数の名前にもなっていますが、
「ダンプ」とは デバッグのために中身を確認する作業
のことを指します。
PHPコードーーーーーーーーーーーーーーーーーー
$var = 1;
var_dump($var);
実行結果
int(1)
ーーーーーーーーーーーーーーーーーーーーーーー
int と表示されました。こちらの記事で解説している型を
表しているものです。
int は 整数型 を表します。次は以下のコードを実行してみましょう。
PHPコードーーーーーーーーーーーーーーーーーー
$var = 1;
var_dump($var, 2, 3);
実行結果ーーーーーーーーーーーーーーーーーーー
int(1)
int(2)
int(3)
ーーーーーーーーーーーーーーーーーーーーーーーーー
ここで
var_dump 関数の2つの特性が見えてくると思います。
- 変数だけでなく、直接 値 をダンプすることも出来る。
- 複数の変数や値を渡すことが出来る。
実行結果ーーーーーーーーーーーーーーーーーーー
int(1) int(2) int(3)
ーーーーーーーーーーーーーーーーーーーーーーーーー
もしこう表示されてしまっても何か間違ったことを
してしまったわけではありません。
あなたが恐らくブラウザ上でそのまま見ている
のが原因でしょう。
そのままページの HTMLソース を表示してみてください。
正しく表示されるはずです。
HTMLを今まで学んできた方であれば、
改行をソースに記載してもブラウザ上では
反映されないのはご存知のはずです。
HTMLソース上ではなくブラウザ上で
そのまま確認したい場合に、以下のように
タグを利用することがあります。
<?php $var = 1; var_dump($var, 2, 3); ?>
また、いっそのこと
「HTMLじゃなくてテキストとして扱ってしまえ!」
という発想で header 関数を使って
MIMEタイプを text/plain に変えてしまうのもアリです。
これだとソースを見ているのと全く同じことになります。
PHPコードーーーーーーーーーーーーーーーーーーーーー
header('Content-Type: text/plain; charset=utf-8');
$var = 1;
var_dump($var, 2, 3);
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
さて、次に文字列をダンプしてみましょう。
日本語をダンプする際にはブラウザ上での
文字化けを防ぐために
header関数で文字コードを指定しましょう。
PHPコードーーーーーーーーーーーーーーーーーーーーー
header('Content-Type: text/html; charset=utf-8');
var_dump('a', 'bc', 'def', 'あ');
実行結果ーーーーーーーーーーーーーーーーーーーーーー
string(1) "a"
string(2) "bc"
string(3) "def"
string(3) "あ"
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
string の右の数字は勘のいい人なら「文字数かな・・・?」 と予想されると思いますが、
半分正解・半分誤りとでも言っておきましょうか。
何故ならば最後の例の
あ で文字数だとおかしな結果となるからです。
厳密な正解は バイト数です。
最後にいろいろな例を掲載しておきます。
まだわからないところもある方もいると思います。
そんな方はこんなものもあるんだくらいで
今は考えておいてください。
PHPコードーーーーーーーーーーーーーーーーーーーーー
var_dump('Test') // 文字列
var_dump(1); // 整数値
var_dump(1.0); // 浮動小数点数(一般値)
var_dump(1.8e308); // 浮動小数点数(無限大値)
var_dump(1.8e308 - 1.8e308); // 浮動小数点数(NAN値)
var_dump(true); // 論理値(真)
var_dump(false); // 論理値(偽)
var_dump(null); // NULL値
var_dump(array()); // 配列
var_dump(new stdClass); // オブジェクト
var_dump(tmpfile()); // リソース
実行結果ーーーーーーーーーーーーーーーーーーーーーーー
string(4) "Test"
int(1)
float(1)
float(INF)
float(NAN)
bool(true)
bool(false)
NULL
array(0) {
}
object(stdClass)#1 (0) {
}
resource(1) of type (stream)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
今回はこのくらいにしておきましょう。
デバッグは初めのうちはあまり意識しないかもしれませんが、
方法によって見つけやすさが変わります。
どんどん使っていきましょう。