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

时间:2015-09-11 17:35:47

标签: php namespaces

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

所以,当我这样做时:

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

$ myobj-&gt; doMethod()如何知道第4行的命名空间是TestTest?

1 个答案:

答案 0 :(得分:1)

仅当未从全局范围调用该方法时,才可以执行此操作。那是因为没有真正的方法可以回溯它(请有人在这里纠正我,如果不是这样的话!)。最简单的解决方案是将您的呼叫置于一个功能中。如果您正在做这类事情,那么您可能会使用某种方法。如果是这种情况,那么你可以使用debug_backtrace函数和反射类的组合:

file1.php:

<?php

namespace myns;

require 'file2.php';

function example($class) {
    echo $class->nstest();
}

$class = new \myotherns\someclass();
echo example($class);

file2.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();
        }
    }
}

这里是online demo

您需要根据最终调用方法的方式进行调整,但这应该很简单。