AriehGlazer
AriehGlazer

Reputation: 2320

Checking if a class is a subclass of another

I want to check if a class is a subclass of another without creating an instance. I have a class that receives as a parameter a class name, and as a part of the validation process, I want to check if it's of a specific class family (to prevent security issues and such). Any good way of doing this?

Upvotes: 27

Views: 27105

Answers (4)

Fabian Schmengler
Fabian Schmengler

Reputation: 24576

You can use is_a() with the third parameter $allow_string that has been added in PHP 5.3.9. It allows a string as first parameter which is treated as class name:

Example:

interface I {}
class A {}
class B {}
class C extends A implements I {}

var_dump(
    is_a('C', 'C', true),
    is_a('C', 'I', true),
    is_a('C', 'A', true),
    is_a('C', 'B', true)
);

Output:

bool(true)
bool(true)
bool(true)
bool(false)

Demo: http://3v4l.org/pGBkf

Upvotes: 22

Alex Barrett
Alex Barrett

Reputation: 16475

is_subclass_of() will correctly check if a class extends another class, but will not return true if the two parameters are the same (is_subclass_of('Foo', 'Foo') will be false).

A simple equality check will add the functionality you require.

function is_class_a($a, $b)
{
    return $a == $b || is_subclass_of($a, $b);
}

Upvotes: 47

matpie
matpie

Reputation: 17522

Check out is_subclass_of(). As of PHP5, it accepts both parameters as strings.

You can also use instanceof, It will return true if the class or any of its descendants matches.

Upvotes: 16

Peter Bailey
Peter Bailey

Reputation: 105914

Yup, with Reflection

<?php

class a{}

class b extends a{}

$r = new ReflectionClass( 'b' );

echo "class b "
    , (( $r->isSubclassOf( new ReflectionClass( 'a' ) ) ) ? "is" : "is not")
    , " a subclass of a";

Upvotes: 15

Related Questions