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()より良くなったわけではない。
まず最初は、表示が少し変わっただけのものです。
gettype | get_debug_type |
---|---|
int | integer |
double | float |
NULL | null |
boolean | bool |
正直これはどうでもいい。表現が違うだけで意味は同じだと分かるから。
また、ぜんぶが変わったわけではなく変わらないものもあります。
gettype | get_debug_type |
---|---|
string | string |
array | array |
resource(closed) | resource(closed) |
クラス名を表示するようになった
gettype | get_debug_type |
---|---|
object | クラス名 |
get_debug_type() でのクラスインスタンスはクラス名を表示するようになりました。
これはデバッグに使うには良い変更。
'object' って言われても、『で? そのクラスは何なん?』と思ってたので。
リソース型は()で詳細を表示するようになった
もうひとつ詳細を表示するようになったものがあります。リソース型です。
リソース型と言われてもピンとこない人がいるかもしれませんが、ファイルやソケット通信を扱うときに振られるIDのようなもの。
サンプルコードで表示された 'resource(stream)' はファイル・ストリームのことを指しています。
ストリームはファイルとストレージとの間で行われるファイル操作の一連の流れのこと。
ファイルは直接ストレージとやり取りをせず、間にバッファ(メモリ)を介します。そのバッファのことをストリームといいます。
プログラム ⇔ ストリーム ⇔ ストレージ(HDDやSSD)
get_debug_type()で良くなったこと
クラス名を表示するようになった。
リソースの詳細を表示するようになった。
これ以外は大した変更はない。
これぐらいの変更なら gettype() を修正すればいいのに、と思いますがそうはならなかったのは関数名でしょう。
'gettype' ってすると、そのあと変数の型チェックができるんじゃないかと想像してしまいます。
(戻り値はすべて文字列なので型チェックには使えない。)
この勘違いをなくすために、あえて新関数を追加したと思う。
PHP公式ドキュメント