如何获取 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;
}
}
我为我的英语不好提前道歉。 希望大家看完代码就明白了。
如何获取 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;
}
}