Get "PHP 8 in a Nuthshell" (Now with PHP 8.4)
Amit Merchant

Amit Merchant

A blog on PHP, JavaScript, and more

Get native type of a variable using get_debug_type() in PHP 8

Before PHP 8, whenever you wanted to get the type of a variable, you could use the native gettype function. Check the examples below.

<?php

$foo = 'bar';

echo gettype($foo); // string

$object = new stdClass;

echo gettype($object); // object

As you can see, the gettype function would return the type of a variable in form of a string. Here are all the possible values returned by the function.

  • “boolean”
  • “integer”
  • “double” (for historical reasons “double” is returned in case of a float, and not simply “float”)
  • “string”
  • “array”
  • “object”
  • “resource”
  • “resource (closed)” as of PHP 7.2.0
  • “NULL”
  • “unknown type”

But the problem with gettype is, it returns the long-form types instead of native and more familiar type names. For instance, it returns integer instead of int, double instead of float, and so on.

To mitigate this issues, PHP 8 has introduced a new function called get_debug_type().

The get_debug_type() function

The new get_debug_type function would return the true “native” type of a variable. And as I said earlier, the function would differ from gettype in that it would return native type names, e.g. int rather than integer, double instead of float.

The following table shows what get_debug_type() returns for different values, and what gettype() returns for the same value (if it is different):

Value get_debug_type() gettype()
0 int integer
0.1 float double
true bool boolean
false bool boolean
“hello” string  
[] array  
null null NULL
A class with name “Foo\Bar” Foo\Bar object
An anonymous class class@anonymous object
A resource resource (xxx) resource
A closed resource resource (closed)  

Apart from this, the function would automatically resolve the class names of objects. So, instead of doing it like this using gettype

<?php

$bar = $arr['key'];

if (!($bar instanceof Foo)) {
  throw new TypeError('Expected ' . Foo::class . ' got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));
}

…You can simplify it using get_debug_type (like get_class) like so.

<?php
$bar = $arr['key'];

if (!($bar instanceof Foo)) { 
  throw new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));
}

In closing

So, if you want to be more consistent in getting the type of a variable and to avoid situations where types that cannot be handled by existing PHP runtime checking based on parameter types, you should be safe using the get_debug_type instead of gettype function.

Learn the fundamentals of PHP 8 (including 8.1, 8.2, and 8.3), the latest version of PHP, and how to use it today with my new book PHP 8 in a Nutshell. It's a no-fluff and easy-to-digest guide to the latest features and nitty-gritty details of PHP 8. So, if you're looking for a quick and easy way to PHP 8, this is the book for you.

Like this article?

Buy me a coffee

👋 Hi there! I'm Amit. I write articles about all things web development. You can become a sponsor on my blog to help me continue my writing journey and get your brand in front of thousands of eyes.

Comments?