如何获取 Class 为 运行 的命名空间?

How can I get the namespace where the Class is run?

我为我的英语不好提前道歉。 希望大家看完代码就明白了。

如何获取 Class 所在的命名空间 运行?
但是我不想将 NAMEPSACE 作为参数传递给该方法。

Route.php

namespace sys;

class Route{
    static public function getNamespaceOfRunFile(){
        echo namespace;
    }
}

app/example.php

namespace app\example;
use sys\Route;

Route::getNamespaceOfRunFile(); //echo "app\example"

我必须在路线 class 内获取“app\example”。

谢谢..

无法获取命名空间使用 get_called_class(),甚至 debug_backtrace() 也无法在 example.php 文件中找到命名空间。

get_called_class() return sys\Route 用于 class::method() 调用。

像这样找到调用者文件的命名空间需要一些小技巧。首先使用回溯获取调用者文件及其内容,然后使用 naholyr on GitHub 创建的函数仅提取命名空间。

这里是 Route.php.

的完整源代码
namespace sys;

class Route{
    static public function getNamespaceOfRunFile(){
        $traces = debug_backtrace();
        // get caller file.
        foreach ($traces as $trace) {
            if (isset($trace['file']) && $trace['file'] !== __FILE__) {
                $file = $trace['file'];
                break;
            }
        }


        if (!empty($file) && is_file($file)) {
            $fileContents = file_get_contents($file);
            return (by_token($fileContents));
        }
    }
}

/**
 * @link https://gist.github.com/naholyr/1885879 Original source code.
 */
function by_token ($src) {
    $tokens = token_get_all($src);
    $count = count($tokens);
    $i = 0;
    $namespace = '';
    $namespace_ok = false;
    while ($i < $count) {
        $token = $tokens[$i];
        if (is_array($token) && $token[0] === T_NAMESPACE) {
            // Found namespace declaration
            while (++$i < $count) {
                if ($tokens[$i] === ';') {
                    $namespace_ok = true;
                    $namespace = trim($namespace);
                    break;
                }
                $namespace .= is_array($tokens[$i]) ? $tokens[$i][1] : $tokens[$i];
            }
            break;
        }
        $i++;
    }

    if (!$namespace_ok) {
        return null;
    } else {
        return $namespace;
    }
}