【问题标题】:How to detect the last namespace used in PHP?如何检测 PHP 中使用的最后一个命名空间?
【发布时间】:2012-01-13 19:35:35
【问题描述】:

如果我在不同的命名空间(以及文件)中有两个类,并且它们都在全局命名空间中调用了一个函数 - 是否有任何方法可以在不传递值的情况下识别哪个命名空间调用了该函数?

namespace A;
class Test { function run() { \func(); }

...

namespace B;
class Test { function run() { \func(); }

...

function func()
{
    // Did a class from "\A" call me or "\B"...?
}

我的第一个想法是使用__NAMESPACE__ constant。但这是就地计算的,所以它不能解决这个问题。

【问题讨论】:

  • 不知道为什么这是必要的,当然如果函数必须根据调用它的位置来做不同的事情,那么你有两个单独的命名空间函数......如果它需要做一些事情不同的对象,然后将对象作为参数传递给函数
  • @Mark 我的想法完全正确。我想您可以检查调用堆栈或使用某种反射。据我所知,该语言不支持您想要的。
  • @Frits - 对于同等要求stackoverflow.com/questions/743686/…,有很多比 debug_backtrace 更好的方法(例如 __ NAMESPACE __ 常量作为参数传递给函数
  • 这是一个奇怪的请求,但 PHP 5.4 的特性很快就会解决这个问题。
  • @Mark - 当然,但我认为关键是命名空间没有作为参数传入(顺便说一句,这不是设计函数的好方法:p)。

标签: php class namespaces


【解决方案1】:

您可以在每个命名空间中定义函数的版本,然后调用 func();

namespace A;
class Test { function run() { func(); }

...

namespace B;
class Test { function run() { func(); }

...

namespace A
{
    function func()
    {
        \func(__NAMESPACE__);
    }
}

namespace B
{
    function func()
    {
        \func(__NAMESPACE__);
    }
}

namespace 
{
    function func($namespace)
    {
        //work with $namespace
    }
}

【讨论】:

【解决方案2】:

debug_backtrace() 将显示调用堆栈。它还为您提供了调用对象的类名。你可以解析出这个日期并找到命名空间。

http://www.php.net/manual/en/function.debug-backtrace.php

function func()
{
    $trace = debug_backtrace();
    $class = $trace[1]['class']; //Should be the class from the previous function

    $arr = explode($class, "\");
    array_pop($arr);
    $namespace = implode($arr, "\");
}

让我知道这是否有效。它可能仅在从对象或类内部调用 func() 时才有效。

【讨论】:

  • 确保转义转义字符 (`) if you use double quotes ("`)。
  • +1 因为这是一个有效的答案。但是,debug_backtrace 对我来说不是一个合理的选择,因为它太慢了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多