检查类是否是另一个类的子类

Ari*_*zer 20 php oop inheritance class

我想在不创建实例的情况下检查类是否是另一个类的子类.我有一个类作为参数接收类名,作为验证过程的一部分,我想检查它是否属于特定的类系列(以防止安全问题等).这样做有什么好办法吗?

Ale*_*ett 32

is_subclass_of()将正确检查一个类是否扩展另一个类,但true如果两个参数相同(is_subclass_of('Foo', 'Foo')将是false),则不会返回.

简单的相等检查将添加您需要的功能.

function is_class_a($a, $b)
{
    return $a == $b || is_subclass_of($a, $b);
}
Run Code Online (Sandbox Code Playgroud)

  • is_a()适用于对象的实例,而不是类本身的名称. (5认同)

Pet*_*ley 13

是的,有反思

<?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";
Run Code Online (Sandbox Code Playgroud)


mat*_*pie 11

退房is_subclass_of().从PHP5开始,它接受两个参数作为字符串.

您也可以使用instanceof,如果类或其任何后代匹配,它将返回true .


Fab*_*ler 7

您可以使用PHP 5.3.9中添加is_a()的第三个参数$allow_string.它允许将字符串作为第一个参数,将其视为类名:

例:

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)
);
Run Code Online (Sandbox Code Playgroud)

输出:

bool(true)
bool(true)
bool(true)
bool(false)
Run Code Online (Sandbox Code Playgroud)

演示:http://3v4l.org/pGBkf