是否可以“静态”检查FQCN是否属于PHP中的给定类型?

时间:2012-06-06 10:11:40

标签: php reflection types instance

如果包含FQCN的字符串如$fqcn

,则可以检查静态(意味着不创建实例)
function checkCreatingInstance($fqcn)
{
    // Create a new instance
    $instance = new $fqcn;

    return ($instance instanceof 'MyNamespace\Entity\SendMessage');
}

function checkStatically($fqcn)
{
    /* TODO */
}

$fqcn = 'MyNamespace\Entity\SendSmallTextMessage';
var_dump(checkCreatingInstance($fqcn)); // true

属于哪种类型?示例层次结构:

namespace MyNamespace\Entity;

class SendMessage { /* Stuff */ }

namespace MyNamespace\Entity;

class SendNewsletter extends SendMessage { /* Stuff */ }

namespace MyNamespace\Entity;

class SendSmallTextMessage extends SendMessage { /* Stuff */ }

2 个答案:

答案 0 :(得分:3)

是。 is_a()会执行此操作,如果您将TRUE作为第三个参数传递。

Example

这样做的好处是你可以编写你的函数,使它接受和对象或字符串,它将以任何方式工作,你不必有两个函数用于静态和实例化的检查:

function checkIsChildOf ($objOrFQCN, $parent)
{
    return is_a($objOrFQCN, $parent, TRUE);
}

另一个PHP手册很差的例子 - 这个行为记录在手册中,据我所知,但我不知道为什么你没有看到它,所以手册很差,不能做到可见。

答案 1 :(得分:2)

namespace Foo;

class A { }

class B extends A { }

class C { }

is_subclass_of('\Foo\A', '\Foo\A');  // false
is_subclass_of('\Foo\B', '\Foo\A');  // true
is_subclass_of('\Foo\C', '\Foo\A');  // false

http://php.net/is_subclass_of