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


How to check if a class belongs to a certain namespace

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

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

使用ZF2,我得到了onDispatch事件的事件处理程序。但是,在调度任何模块的任何控制器时,都会调用该处理程序。显然,如果这个模块的控制器正在被调度,我只希望在这个处理程序中执行一个操作。

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

顺便说一句,我暂时解决了这个问题,在类名(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

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

是的,ReflectionClass有getNamespaceName():

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

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

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