如何检查类是否属于某个名称空间

时间:2013-01-08 15:23:16

标签: php oop namespaces

我想知道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

3 个答案:

答案 0 :(得分:4)

您可以使用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);
}

答案 1 :(得分:1)

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

namespace MyProject;

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

答案 2 :(得分:0)

是的,ReflectionClass具有getNamespaceName():

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