含まれているファイルの中から別のファイルを含むファイルの名前を取得したい。
マジック定数があることは知っていますが、インクルードファイルではなくインクルードファイル__FILE__
の名前が返されるため、役に立ちません。
これを行う方法はありますか?それとも、PHPの解釈方法が原因で不可能ですか?
含まれているファイルの中から別のファイルを含むファイルの名前を取得したい。
マジック定数があることは知っていますが、インクルードファイルではなくインクルードファイル__FILE__
の名前が返されるため、役に立ちません。
これを行う方法はありますか?それとも、PHPの解釈方法が原因で不可能ですか?
したがって、この質問はかなり古いですが、私は答えを探していましたが、満足できずにここを離れた後、出くわしました$_SERVER['SCRIPT_FILENAME'];
もちろん、インクルードを行うphpファイルがWebページである場合、これは機能します。
これにより、サーバー上の「インクルード ファイル」のフル パスが得られます。例: /var/www/index.php。そのため、例えば index.php などのファイル名だけが必要な場合は、basename() などを使用する必要があります。
basename($_SERVER['SCRIPT_FILENAME']);
したがって、index.php に次の行があるとします。
<?php include("./somephp.php"); ?>
そしてsomephp.phpにはあなたが持っています
echo "this is the file that included me: " . basename($_SERVER['SCRIPT_FILENAME']);
あなたが得る
this is the file that included me: index.php
ブラウザに出力します。www.example.com
これは、ユーザーがファイル名を URL に明示的に含めず にファイルにアクセスする場合にも機能しますwww.example.com/index.php
。
これをカバーする簡単な方法が見つかりません。しかし、インクルードが本当に重要な場合は、グローバル変数と独自のインクルード関数を使用してハックできます。
例えば
<?php
$g_including_files = array();
function my_include($file) {
$bt = debug_backtrace();
global $g_including_files;
$g_including_files[basename($file)] = $bt[0]['file'];
return include($file);
}
お役に立てますように:)
これは実際には、PHP テンプレート エンジンが行う特殊なケースにすぎません。この機能を持つことを検討してください:
function ScopedInclude($file, $params = array())
{
extract($params);
include $file;
}
次に、次のようA.php
に含めることができます。C.php
<?php
// A.php
ScopedInclude('C.php', array('includerFile' => __FILE__));
また、問題なく同じ方法でB.php
含めることができます。C.php
<?php
// B.php
ScopedInclude('C.php', array('includerFile' => __FILE__));
C.php
$params 配列を調べることで、そのインクルードを知ることができます。
<?php
// C.php
echo $includerFile;