获取调用上下文的名称空间


Get namespace of call context

我有一个非常简单的问题,但答案可能相当复杂。"如何获得函数调用所在块的名称空间?"

所以,当我这样做的时候:

1. <?php
2. namespace TestTest;
3.
4. $myobj->doMethod();

$myobj-> method()如何知道第4行上的命名空间。测试吗?

这只有在方法没有从全局作用域调用时才有可能。这是因为没有真正的方法可以回溯它(如果不是这样,请有人在这里纠正我!)。最简单的解决方案是将调用放在函数中。如果你在做这类事情,你很可能会使用一个方法。如果是这种情况,那么您可以使用debug_backtrace函数和反射类的组合:

file1.php:

<?php
namespace myns;
require 'file2.php';
function example($class) {
    echo $class->nstest();
}
$class = new 'myotherns'someclass();
echo example($class);

php:

<?php
namespace myotherns;
class someclass {
    function nstest() {
        $backtrace = debug_backtrace();
        $caller = end($backtrace);
        $reflection = new 'ReflectionFunction($caller['function']);
        return $reflection->getNamespaceName();
    }
}

或者全部放在一个文件中:

<?php
namespace myns {
    $someclass = new 'myotherns'someclass();
    echo example($someclass);
    function example($class) {
        echo $class->nstest();
    }
}
namespace myotherns {
    class someclass {
        function nstest() {
            $backtrace = debug_backtrace();
            $caller = end($backtrace);
            $reflection = new 'ReflectionFunction($caller['function']);
            return $reflection->getNamespaceName();
        }
    }
}

这是一个在线演示

你需要根据你最终如何调用你的方法来调整它,但它应该足够简单。