【问题标题】:Is there a namespace aware alternative to PHP's class_exists()?PHP 的 class_exists() 是否有命名空间感知替代方案?
【发布时间】:2013-03-28 04:26:37
【问题描述】:

如果你尝试在 PHP 中类的方法中使用 class_exists(),你必须指定类的全名——当前的命名空间不受尊重。例如,如果我的班级是:

 <?
    namespace Foo;

    class Bar{
       public function doesBooClassExist(){
            return class_exists('Boo');
       }
    }

Boo 是一个类(可以正确地自动加载),看起来像这样

   namespace Foo;

    class Boo{
       // stuff in here
    }

如果我尝试:

$bar = new Bar();
$success = $bar->doesBooClassExist();
var_dump($success);

你会得到一个错误...有没有另一种方法可以做到这一点而不必明确指定完整的类名(即class_exits('Foo\Boo'))?

【问题讨论】:

  • 您是否尝试过在您的doesBooClassExist() 方法中使用__NAMESPACE__ 前缀类名?还是我误解了您要做什么? (见php.net/manual/en/language.namespaces.nsconstants.php
  • @Crontab 这可以按照您的指示完成,如果没有其他方式已经知道命名空间 - 只是个人喜好。您应该将此作为答案。
  • 我不确定,但我认为 class_exists 不在命名空间中搜索是正确的。如果它直接在命名空间中检查,您将如何检查任何命名空间之外的类里面?
  • @Ray 看起来其他几个人在午餐时击败了我。 =)

标签: php namespaces


【解决方案1】:

在 5.5 之前,最好的方法是始终使用完全限定的类名:

public function doesBooClassExist() {
    return class_exists('Foo\Boo');
}

这并不难,而且它绝对清楚地说明了您所指的内容。请记住,您应该追求可读性。命名空间导入在编写时很方便,但会使阅读变得混乱(因为在阅读代码时需要牢记当前命名空间和任何导入)。

然而,在 5.5 中,有一个新的结构即将到来:

public function doesBooClassExist() {
    return class_exists(Boo::class);
}

class 伪魔术常量可以放在任何标识符上,它会返回将解析为的完全限定类名......。

【讨论】:

  • + 这是更好的方法
  • 不应该转义反斜杠(根据PHP namespaces FAQ)吗?
  • 请注意,这不能与动态类名一起使用。它将抛出 致命错误:编译时不允许动态类名 ::class fetch - 但如果它们驻留在当前命名空间中,您可以手动组装完全限定的类名:$fqcn = __NAMESPACE__.'\\'.$class_name
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 2017-08-06
  • 1970-01-01
  • 2022-12-19
  • 2012-07-26
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多