【问题标题】:How to check if a class belongs to a certain namespace如何检查一个类是否属于某个命名空间
【发布时间】:2012-12-22 11:58:59
【问题描述】:

我想知道 PHP 是否提供了一种本地方式来检查一个类(实例)是否属于某个命名空间。

这并不重要,只是为了让您了解我是如何提出这个问题的:

使用 ZF2,我为onDispatch 事件提供了一个事件处理程序。但是,对于任何模块的任何控制器的每次调度都会调用此处理程序。显然,如果正在调度 this 模块的控制器,我只想在此处理程序中执行一个操作。

所以我想检查 Controller 是否在我的模块的命名空间内。

顺便说一句,我在类名 (strpos($className, 'ModuleName\Controller') !== false) 上使用字符串比较暂时解决了这个问题。我想使用substr()strncmp() 或类似的东西比strpos() 表现更好,但在我的情况下并不重要。

提前致谢!

// 编辑:为了清楚起见,我正在寻找类似的东西:

// $foo is an instance of MyApp\Controller\Moo
is_in_namespace('MyApp\Controller', $foo); // true

// $foo is an instance of MyApp\Controller\Moo
get_namespace($foo) === 'MyApp\Controller'; // true

【问题讨论】:

  • @JasonMcCreary 你能解释一下我的问题与你链接的问题有什么关系吗?
  • 嗯,它是一个给定类的命名空间......你读过它还是根据标题判断它?似乎适用,看看下面的两个答案是该问题的相同答案。

标签: php oop namespaces


【解决方案1】:

你可以使用get_class()来获取对象的类,然后你可以使用strops()来查看它是否包含命名空间。没有等效的 get_namespace() 函数。

例子:

function is_in_namespace($namespace, $object) {
    return strpos(get_class($object), $namespace . '\\') === 0;
}
function get_namespace($object) {
    $class = get_class($object);
    $pos = strrpos($class, '\\');
    return substr($class, 0, $pos);
}

【讨论】:

  • 这正是我目前正在做的,感谢您的回答!
  • 从 PHP8 开始,我们现在可以使用 str_starts_with 而不是 strpos === 0
【解决方案2】:

您可以使用常量__NAMESPACE__ 来获取当前命名空间

namespace MyProject;

echo '"', __NAMESPACE__, '"'; // outputs "MyProject"

【讨论】:

  • 嗯,这和我做的差不多,只是你动态插入命名空间而不是把它写入源代码。
  • @DanielM 这个说法没有多大意义......它在源代码中,不是吗?
  • 有一个更清晰的例子,这将是一个更好的选择。常量 NAMESPACE 包含当前命名空间的名称,因此使用 strpos 可以很容易地找出一个类是否属于某个命名空间。
【解决方案3】:

是的,ReflectionClass 有getNamespaceName():

(new \ReflectionClass($foo))->getNamespaceName();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多