php-クラスが実行されている名前空間を取得するにはどうすればよいですか?
英語が下手であることを事前に謝罪します。 コードを読んで理解していただければ幸いです。
クラスが実行されている名前空間を取得するにはどうすればよいですか?
ただし、 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"
Routeクラス内で「app\example」を取得する必要があります。
ありがとう..
namespace sys;
class Route{
static public function getNamespaceOfRunFile(){
echo namespace;
}
}
app / example.php
namespace app\example;
use sys\Route;
Route::getNamespaceOfRunFile(); //echo "app\example"
Routeクラス内で「app\example」を取得する必要があります。
ありがとう..
答え :
解決策:
名前空間にget_called_class()を使用させることはできません。ただし、
debug_backtrace()
を使用することはできません。 t example.phpファイルで名前空間を見つけます。
このように呼び出し元ファイルの名前空間を見つけるには、ちょっとしたトリックが必要です。最初にバックトレースを使用して呼び出し元ファイルとそのコンテンツを取得し、次に ここにRoute.phpの完全なソースコードがあります。 get_called_class() は、呼び出された
class::method()
で使用されるsys\Route
を返します。< / p>
namespace sys;
クラスルート{
静的パブリック関数getNamespaceOfRunFile(){
$ traces = debug_backtrace();
//呼び出し元ファイルを取得します。
foreach($ traces as $ trace){
if(isset($ trace ['file'])&& $ trace ['file']!== __FILE__){
$ file = $ trace ['file'];
壊す;
}
}
if(!empty($ file)&& is_file($ file)){
$ fileContents = file_get_contents($ file);
return(by_token($ fileContents));
}
}
}
/ **
*@linkhttps://gist.github.com/naholyr/1885879元のソースコード。
* /
関数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){
//名前空間宣言が見つかりました
while(++ $ i <$ count){
if($ tokens [$ i] ===';'){
$ namespace_ok = true;
$ namespace = Trim($ namespace);
壊す;
}
$namespace。=is_array($ tokens [$ i])? $ tokens [$ i] [1]:$ tokens [$ i];
}
壊す;
}
$ i ++;
}
if(!$ namespace_ok){
nullを返します。
} そうしないと {
$namespaceを返します。
}
}
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。