ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, get_debug_type, 変数の型を文字列で返す関数。よりデバッグしやすい表示。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

PHPの変数の型をデバッグするのに gettype() を使いますが、PHP8.0 ではさらに分かりやすく表示する get_debug_type() が追加されました。

これらの関数は文字列で型名を返すので型のチェックには使えません。

その勘違いをなくすために関数名に 'debug' が入ってます。

この関数はかんたんなので、いきなりサンプルコードでいきましょう。

gettype() とのちがいを見るために、get_debug_type(), gettype() を同じ条件で実行します。

(ついでに利用するデータを表示するvar_export() も実行する。)

<?php

function debug($val)
{
    echo 'var_export    : ' . var_export($val, true) . PHP_EOL;
    echo 'gettype       : ' . gettype($val) . PHP_EOL;
    echo 'get_debug_type: ' . get_debug_type($val) . PHP_EOL;
    echo PHP_EOL;
}

debug(100);
debug(1.23456);
debug('abc');
debug(null);
debug(true);
debug([1, 2, 3]);
debug(['one' => 1, 'two' => 2, 'three' => 3]);

class Test
{
}

debug(new Test());

$fp = fopen(__FILE__, 'r');
debug($fp);

fclose($fp);
debug($fp);
実行結果
var_export    : 100
gettype       : integer
get_debug_type: int

var_export    : 1.23456
gettype       : double
get_debug_type: float

var_export    : 'abc'
gettype       : string
get_debug_type: string

var_export    : NULL
gettype       : NULL
get_debug_type: null

var_export    : true
gettype       : boolean
get_debug_type: bool

var_export    : array (
  0 => 1,
  1 => 2,
  2 => 3,
)
gettype       : array
get_debug_type: array

var_export    : array (
  'one' => 1,
  'two' => 2,
  'three' => 3,
)
gettype       : array
get_debug_type: array

var_export    : Test::__set_state(array(
))
gettype       : object
get_debug_type: Test

var_export    : NULL
gettype       : resource
get_debug_type: resource (stream)

var_export    : NULL
gettype       : resource (closed)
get_debug_type: resource (closed)

gettype() と get_debug_type() のちがい

サンプルを実行すると gettype(), get_debug_type() のちがいがはっきりと出ました。ひとつひとつ見ていきましょう。

表示を少し変えただけ。gettype()より良くなったわけではない。

まず最初は、表示が少し変わっただけのものです。

gettypeget_debug_type
intinteger
doublefloat
NULLnull
booleanbool

正直これはどうでもいい。表現が違うだけで意味は同じだと分かるから。

また、ぜんぶが変わったわけではなく変わらないものもあります。

gettypeget_debug_type
stringstring
arrayarray
resource(closed)resource(closed)

クラス名を表示するようになった

gettypeget_debug_type
objectクラス名

get_debug_type() でのクラスインスタンスはクラス名を表示するようになりました。

これはデバッグに使うには良い変更。

'object' って言われても、『で? そのクラスは何なん?』と思ってたので。

リソース型は()で詳細を表示するようになった

もうひとつ詳細を表示するようになったものがあります。リソース型です。

リソース型と言われてもピンとこない人がいるかもしれませんが、ファイルやソケット通信を扱うときに振られるIDのようなもの。

サンプルコードで表示された 'resource(stream)' はファイル・ストリームのことを指しています。

ストリームはファイルとストレージとの間で行われるファイル操作の一連の流れのこと。

ファイルは直接ストレージとやり取りをせず、間にバッファ(メモリ)を介します。そのバッファのことをストリームといいます。

プログラム ⇔ ストリーム ⇔ ストレージ(HDDやSSD)

get_debug_type()で良くなったこと

クラス名を表示するようになった。

リソースの詳細を表示するようになった。

これ以外は大した変更はない。


これぐらいの変更なら gettype() を修正すればいいのに、と思いますがそうはならなかったのは関数名でしょう。

'gettype' ってすると、そのあと変数の型チェックができるんじゃないかと想像してしまいます。

(戻り値はすべて文字列なので型チェックには使えない。)

この勘違いをなくすために、あえて新関数を追加したと思う。

前の投稿
PHP8, fdiv, 浮動小数点の割り算をする関数の追加。'/' の式で十分じゃないか?
PHP8.1, $GLOBALSの丸ごと書き換えはエラーになる
次の投稿

コメントを残す