7

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

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

使用 ZF2,我有一个事件处理程序onDispatch。但是,对于任何模块的任何控制器的每次分派都会调用此处理程序。显然,如果这个模块的控制器正在被调度,我只想在这个处理程序中执行一个动作。

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

顺便说一句,我使用类名(strpos($className, 'ModuleName\Controller') !== false)上的字符串比较暂时解决了这个问题。我想使用substr()orstrncmp()或类似的东西比 性能更好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
4

3 回答 3

6

您可以使用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);
}
于 2013-01-08T15:37:33.180 回答
1

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

namespace MyProject;

echo '"', __NAMESPACE__, '"'; // outputs "MyProject"
于 2013-01-08T15:26:50.860 回答
1

是的,ReflectionClass 有getNamespaceName ():

(new \ReflectionClass($foo))->getNamespaceName();
于 2019-09-25T01:58:07.120 回答