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