【问题标题】:Is possible to "statically" check if a FQCN is of a given type in PHP?是否可以“静态”检查 FQCN 是否属于 PHP 中的给定类型?
【发布时间】:2012-06-10 08:22:57
【问题描述】:

如果字符串包含像$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 */ }

【问题讨论】:

  • 反射 API 可能能够做到这一点,但我不确定。不过,仍然可能是开始寻找答案的好地方。

标签: php reflection types instance


【解决方案1】:

是的。 is_a() 会这样做,如果您将 TRUE 作为第三个参数传递。

Example

这样做的好处是您可以编写函数,使其接受对象或字符串,并且无论哪种方式都可以工作,您不必有两个函数来进行静态和实例化检查:

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

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

【讨论】:

  • @hakre 有趣的编辑...我说它没有记录,因为is_a() 的文档指出第一个参数应该是object 类型而不是mixed。文档中也没有任何内容说“您可以将字符串作为第一个参数传递,它将被视为类的名称”。我想有一个$allow_string 参数的事实确实暗示它会起作用,但我坚持它没有明确记录的声明。
  • @DaveRandom:不是那么突出,但是是为第三个参数写的:"如果这个参数设置为false,则不允许字符串类名作为对象。" 可以阅读:如果为真,则有效。无论如何,它的措辞不是那么好,可能是因为它是后来的变化。我的英语不是很好,但我尝试编辑。你知道你可以编辑那些手册页吗?
  • @hakre 我直到现在才这样做。我认为它在上线之前经过了同行评审?
  • @DaveRandom:当然。请尝试此预览是否适合您:preview.php.net/manual/en/…
【解决方案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

【讨论】:

  • 有趣 - 我真的不明白这和 is_a() 之间的区别,并且手册似乎没有充分解释。 +1 是一个很好的工作答案。
  • is_subclass_of 就像名字所说的那样,它返回true 当且仅当该类是一个 sub 类。 is_a 也返回 true 如果类是它本身,即is_a('\Foo\A', '\Foo\A') 的第一个案例也是true
猜你喜欢
  • 2015-02-19
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多