【发布时间】:2012-01-21 01:48:22
【问题描述】:
我想知道在调用函数时是否可以确定当前命名空间是什么。我有这个函数声明:
<?php
namespace Site\Action;
function add ($hook, $function) {
/**
* determine the namespace this was called from because
* __NAMESPACE__ is "site\action" :(
*/
if (is_callable($function))
call_user_func($function);
}
?>
在另一个文件上:
<?php
namespace Foo;
function bar () {
}
?>
假设我有这个作为我的程序代码:
<?php
namespace Foo;
Site\Action\add('hookname', 'bar');
?>
假设在这种情况下Bar 旨在解析为Foo\bar,因为这是调用它的命名空间。
这又是一个很长的解释,是否可以确定调用 Site\Action\add() 的活动命名空间?
提前致谢。
【问题讨论】:
-
您可以将
__NAMESPACE__作为参数传递。您还可以通过查看来自debug_backtrace的调用堆栈来获取调用者的命名空间,但我真的不建议这样做。 -
实际上我怀疑
debug_backtrace会这样做,或者我可能遗漏了什么。我想我可能只需要通过__NAMESPACE__或者只是重新考虑整个架构。 -
@GordonM 你建议我们不要使用
debug_backtrace()的动机是什么?请详细说明... -
@nickl-debug_backtrace 用于调试(线索在名称中)。它会生成大量您不需要的数据,并且由于它是用于调试的,因此它可能没有那么优化。另外,如果您的函数需要知道调用它们的内容,我怀疑您的设计有问题。它们应该关心的是传递给它们的参数。如果您真的需要知道,那么只需将函数名作为参数传递就会容易得多。
$foo = someFunction ($arg1, $arg2, __NAMESPACE__) -
@GordonM 用它跟踪堆栈的任何其他名称调用它。对于您的论点,我们都应该避免 print_r 但至少它不称为 debug_print =) 有很多选项可以限制生成的数据 DEBUG_BACKTRACE_IGNORE_ARGS 并且 5.4 还引入了 $limit。由于您可以传递完全限定名称,因此您的解决方案变得多余。问题不是我的设计有什么问题,除非您有更好的方法来解决问题,否则无论用例要求如何,您都必须承认所提供的解决方案与宣传的一样。我认为 SO 的目的是回答问题?
标签: php oop namespaces