【问题标题】:What is the most efficient way of getting the namespace of a class in PHP 5.5?在 PHP 5.5 中获取类的命名空间的最有效方法是什么?
【发布时间】:2014-05-11 05:49:54
【问题描述】:

PHP 5.5 引入了简洁的class name resolution method using the ::class syntax。我想这让很多人的生活变得更轻松。它确实对我有用。

但现在我发现自己必须更进一步:获取某个类的命名空间。这不是一项艰巨的编程任务。可以通过字符串操作或数组来实现:

$parts = explode('\\', \Foo\Bar\Baz::class);
array_pop($parts);
return implode('\\', $parts); // returns "Foo\Bar"

但这有点矫枉过正,因为我经常使用它(作为元编程的一种手段)。当我分析应用程序时,它实际上显示为一个瓶颈。有人知道更有效的解决方案吗?

【问题讨论】:

  • 回答已删除的评论:__NAMESPACE__ 常量会有所帮助,如果您能找到一种在不同命名空间中使用它的方法,而不必从每个文件中返回 __NAMESPACE__。 PSR0 在这里不适用,因为我正在做元编程。没有“一个文件=一个命名空间”的规则。即使我确实坚持使用 PSR0,项目文件也由外部自动加载器(Composer)管理。所以我对自动加载过程影响不大。

标签: php metaprogramming


【解决方案1】:

至少

$class = \Foo\Bar\Baz::class;
$namespace = substr($class, 0, strrpos($class, '\\'));

应该更有效率。

【讨论】:

  • 这个get_current_namespaces()函数定义在哪里?
  • 对不起。我最近在我的一个应用程序中使用了这个函数,但我不记得这是我基于this code编写的自定义函数。
  • 是的,这样更快,但不会降低时间复杂度。我在我的问题中确实提到过,字符串和数组解决方案不够快。这里的复杂性充其量仍然是O(n)。我正在寻找更多 O(1) 的东西(正如 ::class 语法所提供的那样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多