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?
4 Answers
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); } 3 Comments
is_class_a('stdClass','\stdClass') will return FALSE even though they are one and the same.instanceof as per @sirlancelot's answer below stackoverflow.com/a/782741/467386You 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
Comments
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.
Comments
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";