【发布时间】:2010-10-21 10:12:18
【问题描述】:
我想在不创建实例的情况下检查一个类是否是另一个类的子类。我有一个接收类名作为参数的类,作为验证过程的一部分,我想检查它是否属于特定的类族(以防止安全问题等)。有什么好的方法吗?
【问题讨论】:
-
这个写法让人迷惑,问题其实是为了确定一个类是否是另一个类的子类。
标签: php class oop inheritance
我想在不创建实例的情况下检查一个类是否是另一个类的子类。我有一个接收类名作为参数的类,作为验证过程的一部分,我想检查它是否属于特定的类族(以防止安全问题等)。有什么好的方法吗?
【问题讨论】:
标签: php class oop inheritance
is_subclass_of() 将正确检查一个类是否扩展另一个类,但如果两个参数相同则不会返回true(is_subclass_of('Foo', 'Foo') 将是false)。
简单的相等性检查将添加您需要的功能。
function is_class_a($a, $b)
{
return $a == $b || is_subclass_of($a, $b);
}
【讨论】:
is_class_a('stdClass','\stdClass') 将返回 FALSE,即使它们是一回事。
instanceof 按照@sirlancelot 在stackoverflow.com/a/782741/467386 下方的回答
是的,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";
【讨论】:
查看is_subclass_of()。从 PHP5 开始,它接受两个参数作为字符串。
你也可以使用instanceof,如果类或它的任何后代匹配,它将返回true。
【讨论】:
您可以将is_a() 与PHP 5.3.9 中添加的第三个参数$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)
);
bool(true)
bool(true)
bool(true)
bool(false)
【讨论】: