Skip to content

Instantly share code, notes, and snippets.

@Pierstoval
Last active July 20, 2025 16:35
Show Gist options
  • Save Pierstoval/ed387a09d4a5e76108e60e8a7585ac2d to your computer and use it in GitHub Desktop.
Save Pierstoval/ed387a09d4a5e76108e60e8a7585ac2d to your computer and use it in GitHub Desktop.
`is_a()` vs `is_subclass_of()`

PHP is_a() vs is_subclass_of()

<?php

class A {}

class B extends A {}

interface I {}

trait T {}

class C extends B implements I {
    use T;
}
Operation is_a() is_subclass_of() instanceof
A of A
A of B
A of I
A of T
A of C
B of A
B of B
B of I
B of T
B of C
I of A
I of B
I of I
I of T
I of C
T of A
T of B
T of I
T of T
T of C
C of A
C of B
C of I
C of T
C of C
{
"require": {
"symfony/console": "^7.3"
}
}
<?php
<<<CONFIG
packages:
- "symfony/console: ^4.1"
CONFIG;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableStyle;
use Symfony\Component\Console\Output\ConsoleOutput;
require __DIR__.'/vendor/autoload.php';
class A
{
}
class B extends A
{
}
interface I
{
}
trait T {
}
class C extends B implements I {
use T;
}
$classes = [
'A',
'B',
'I',
'T',
'C',
];
$rows = [];
foreach ($classes as $class1) {
foreach ($classes as $class2) {
$rows[] = [
$class1.' of '.$class2,
is_a($class1, $class2, true) ? '<fg=green>true</>' : '<fg=red>false</>',
is_subclass_of($class1, $class2, true) ? '<fg=green>true</>' : '<fg=red>false</>',
class_exists($class1) && (new $class1()) instanceof $class2 ? '<fg=green>true</>' : '<fg=red>false</>',
];
}
}
$table = new Table(new ConsoleOutput());
$table->setHeaders(['Operation', 'is_a()', 'is_subclass_of()', 'instanceof']);
$table->setRows($rows);
$table->render();
@Pierstoval
Copy link
Author

@serious-angel Done!

I even updated the display a bit :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment