10

含まれているファイルの中から別のファイルを含むファイルの名前を取得したい。

マジック定数があることは知っていますが、インクルードファイルではなくインクルードファイル__FILE__の名前が返されるため、役に立ちませ

これを行う方法はありますか?それとも、PHPの解釈方法が原因で不可能ですか?

4

4 に答える 4

32

したがって、この質問はかなり古いですが、私は答えを探していましたが、満足できずにここを離れた後、出くわしました$_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

于 2012-10-31T09:06:24.027 に答える
6

これをカバーする簡単な方法が見つかりません。しかし、インクルードが本当に重要な場合は、グローバル変数と独自のインクルード関数を使用してハックできます。

例えば

<?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);                                                                                                                                                                     
    } 

お役に立てますように:)

于 2012-04-22T04:44:42.420 に答える
5

これは実際には、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;
于 2012-04-22T05:01:12.940 に答える