是否存在不使用Reflection获取不含命名空间类名的简便方法?
不用Reflection获取不带命名空间的类名的简便方法
当然有啦!不用Reflection也能轻松拿到不带命名空间的类名,给你分享几个实用的方法,直接就能用到你的代码里:
方法一:原生PHP字符串处理(通用所有PHP项目)
这是最稳妥的原生方案,不需要依赖任何框架组件:
用explode()分割命名空间
在你的process()方法里可以这么写:
public function process() { $fullClassName = get_class($this); $shortClassName = end(explode('\\', $fullClassName)); echo $shortClassName; // 输出 SiteCancelled }
原理是把完整类名按反斜杠\\分割成数组,然后取最后一个元素就是不带命名空间的类名。
用strrpos()+substr()截取
如果担心explode()处理超长类名的性能(其实日常场景几乎可以忽略),也可以用字符串截取的方式:
public function process() { $fullClassName = get_class($this); $shortClassName = substr($fullClassName, strrpos($fullClassName, '\\') + 1); echo $shortClassName; // 输出 SiteCancelled }
strrpos()找到最后一个反斜杠的位置,然后从这个位置的下一位开始截取字符串,得到的就是类名。
方法二:Symfony框架专属快捷方法(适合你的项目)
看你的类命名空间是CRMPiccoBundle,应该是Symfony项目。Symfony提供了现成的工具方法可以直接用:
use Symfony\Component\HttpKernel\Kernel; public function process() { $shortClassName = Kernel::classBasename(get_class($this)); echo $shortClassName; // 输出 SiteCancelled }
这个方法底层其实也是做了字符串处理,但框架已经帮你封装好了,直接调用更省心。
内容的提问来源于stack exchange,提问作者crmpicco
相关产品推荐
相关产品推荐

