gpt4 book ai didi

php - 如何获取运行类的命名空间?

转载 作者:行者123 更新时间:2023-12-04 17:00:54 24 4
gpt4 key购买 nike

我提前为我的英语不好道歉。
我希望你能通过阅读代码来理解。
如何获取运行类的命名空间?
但我不想通过 NAMEPSACE 作为方法的参数。
路由.php

namespace sys;

class Route{
static public function getNamespaceOfRunFile(){
echo namespace;
}
}
应用程序/example.php
namespace app\example;
use sys\Route;

Route::getNamespaceOfRunFile(); //echo "app\example"
我必须在 Route 类中获取“app\example”。
谢谢..

最佳答案

无法获得命名空间使用 get_called_class() , 甚至 debug_backtrace() 上找不到命名空间例子.php 文件。get_called_class()返回 sys\Route用于 class::method()叫。
要找到这样的调用者文件的命名空间,需要一个小技巧。首先使用回溯获取调用者文件及其内容,然后使用由 naholyr on GitHub 创建的函数仅提取命名空间。
这是 的完整源代码路由.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;
}
}

关于php - 如何获取运行类的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70138850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com