is_subclass_of

(PHP 4, PHP 5, PHP 7, PHP 8)

is_subclass_ofComprueba si el objeto tiene esta clase como uno de sus padres o si la implementa

Descripción

is_subclass_of(mixed $object, string $class_name, bool $allow_string = true): bool

Comprueba si el object dado tiene la clase class_name como uno de sus padres o si la implementa.

Parámetros

object

Un nombre de clase o una instancia de objeto. No se genera ningún error si la clase no existe.

class_name

El nombre de clase

allow_string

Si se define este parámetro como false, no se permite el uso del nombre de la clase como object. Esto también previene llamar el autoloader si la clase no existe.

Valores devueltos

Esta función devuelve true si el objeto object pertenece a una clase que sea subclase de class_name, false en caso contrario.

Historial de cambios

Versión Descripción
5.3.9 Se añadió el parámetro allow_string
5.3.7 Se añadió el soporte para class_name para trabajar con interfaces
5.0.3 Es posible especificar también el parámetro object como una cadena (el nombre de la clase)

Ejemplos

Ejemplo #1 Ejemplo de is_subclass_of()

<?php
// definir una clase
class FabricaWidget
{
var
$oink = 'moo';
}

// definir una clase hija
class Hijo_FabricaWidget extends FabricaWidget
{
var
$oink = 'oink';
}

// crear un nuevo objeto
$FW = new FabricaWidget();
$HFW = new Hijo_FabricaWidget();

if (
is_subclass_of($HFW, 'FabricaWidget')) {
echo
"si, \$HFW es una sub-clase de FabricaWidget\n";
} else {
echo
"no, \$HFW no es una sub-clase de FabricaWidget\n";
}


if (
is_subclass_of($FW, 'FabricaWidget')) {
echo
"si, \$FW es una sub-clase de FabricaWidget\n";
} else {
echo
"no, \$FW no es una sub-clase de FabricaWidget\n";
}


// usable sólo desde PHP 5.0.3
if (is_subclass_of('Hijo_FabricaWidget', 'FabricaWidget')) {
echo
"si, Hijo_FabricaWidget es una sub-clase de FabricaWidget\n";
} else {
echo
"no, Hijo_FabricaWidget no es una sub-clase de FabricaWidget\n";
}
?>

El resultado del ejemplo sería:

si, $HFW es una sub-clase de FabricaWidget
no, $FW no es una sub-clase de FabricaWidget
si, Hijo_FabricaWidget es una sub-clase de FabricaWidget

Ejemplo #2 Ejemplo de is_subclass_of() usando una interfaz

<?php
// Definir la interfaz
interface MiInterfaz
{
public function
MiFunción();
}

// Definir la implementación de la clase de la interfaz
class MiClase implements MiInterfaz
{
public function
MiFunción()
{
return
"¡MiClase implementa MiInterfaz!";
}
}

// Instanciar el objeto
$mi_objeto = new MiClase;

// Funciona desde 5.3.7

// Una prueba usando la instancia del objeto de la clase
if (is_subclass_of($mi_objeto, 'MiInterfaz')) {
echo
"Sí, \$mi_objeto es una subclase de MiInterfaz\n";
} else {
echo
"No, \$mi_objeto no es una subclase de MiInterfaz\n";
}

// Una prueba usando una cadena del nombre de la clase
if (is_subclass_of('MiClase', 'MiInterfaz')) {
echo
"Sí, MiClase es una subclase de MiInterfaz\n";
} else {
echo
"No, MiClase no es una subclase de MiInterfaz\n";
}
?>

El resultado del ejemplo sería:

Sí, $mi_objeto es una subclase de MiInterfaz
Sí, MiClase es una subclase de MiInterfaz

Notas

Nota:

Esta función cargará cualquier autocargador registrado si la clase todavía no existe.

Ver también

  • get_class() - Devuelve el nombre de la clase de un objeto
  • get_parent_class() - Recupera el nombre de la clase padre de un objeto o clase
  • is_a() - Comprueba si un objeto es de una clase o tiene esta clase como una de sus madres
  • class_parents() - Devuelve las clases padre de la clase dada.

add a note add a note

User Contributed Notes 8 notes

up
16
gunniboyh at web dot de
18 years ago
is_subclass_of() works also with classes between the class of obj and the superclass.

example:
<?php
class A {};
class
B extends A {};
class
C extends B {};

$foo=new C();
echo ((
is_subclass_of($foo,'A')) ? 'true' : 'false');
?>

echoes 'true' .
up
10
nicholas at aquarionics dot com
15 years ago
This might be useful to someone, so:

If you're using Autoload, you should be aware that this will attempt to autoload $classname if it isn't already loaded. I discovered this when I had something using is_subclass_of inside an error thrown by autoload, which then recursed until it ran out of memory.
up
1
alan at jynxy.net
6 years ago
The $allow_string parameter is not very clearly documented. When true, it simply allows the first parameter to be the name of a class, instead of an object whose class we are interested in.

Some usage examples:

class parent_class {
    // objects and methods ...
}

$possible_child_object = new possible_child_class(); // might be an extension of parent_class

$result = is_subclass_of($possible_child_object, 'parent_class'); //  valid
$result = is_subclass_of($possible_child_object, 'parent_class', false); //  valid
$result = is_subclass_of('possible_child_class', 'parent_class', true); // valid
$result = is_subclass_of('possible_child_class', 'parent_class', false); // not valid
up
0
Anonymous
2 years ago
You can check if your current class is a child with:

<?php is_subclass_of($this, self::class) ?>

<?php
class a {
    public function
check(): bool {
        return
is_subclass_of($this, self::class);
    }
}

class
b extends a {}

$a = new a();
$b = new b();

echo
$a->check() ? 'Yes' : 'No';
echo
PHP_EOL;
echo
$b->check() ? 'Yes' : 'No';
echo
PHP_EOL;
?>

prints:
No
Yes
up
-3
kostyl_kostyl gav-gav mail point ru
15 years ago
<?php
interface I {
}
class
A implements I {
}
class
B extends {
}
if (
is_subclass_of('A', 'I')) {
    echo
'good<br>';
}
else {
    echo
'bad<br>';
}
if (
is_subclass_of('B', 'I')) {
    echo
'good<br>';
}
else {
    echo
'bad<br>';
}
if (
is_subclass_of('B', 'A')) {
    echo
'good<br>';
}
else {
    echo
'bad<br>';
}
?>

result:
bad <- you must to describe intermediate class B to be good
good
good
up
-2
Damien Bezborodov
15 years ago
If you need something similar to is_subclass_of() to determine if a class implements an interface before instantiating it, use reflection:

<?php

interface A_Interface {}
class
A implements A_Interface {}

$reflectionA = new ReflectionClass('A');
var_dump(
   
$reflectionA->implementsInterface('A_Interface')
);

?>
bool(true)
up
-3
jm
16 years ago
It would appear that is_subclass_of is case insensitive unlike get_class in php5.
i.e.

<?php
class fooBar {}
class
bar extends fooBar {}

assert(get_class(new fooBar()) == "fooBar");
assert(is_subclass_of(new bar(), "foobar") == true);
?>

i run across this while migrating some code from php4 to php5 and the code would only half-the-time break.
up
-7
Ondra Zizka
18 years ago
For PHP4:

<?php
/** Returns whether specified class is subclass of the other class. */
function is_subclass($sClass, $sExpectedParentClass){
    do if(
$sExpectedParentClass === $sClass ) return true;
    while(
false != ($sClass = get_parent_class($sClass)) );
    return
false;
}
// Test:
class A {} class B extends A {} class C extends B {} echo (int) is_subclass('C', 'A');
?>
To Top