インクルードされたPHPファイルは、それがどこからインクルードされたかを知ることができますか?

php
インクルードされたPHPファイルは、それがどこからインクルードされたかを知ることができますか?

例えば、

これはindex.phpです

<?
require_once('header.php');
?>

header.phpは、index.phpに含まれていることを知ることができますか?

–EDIT–

私は解決策を見つけました:

function backtrace_filename_includes($name){
    $backtrace_array=debug_backtrace();
    if (strpos($backtrace_array[1]['file'],$name)==false){
        return false;
    }else{
        return true;
    }
}

header.php

<?
if (backtrace_filename_includes('index.php')) echo "index.php";
?>

  15  2


ベストアンサー

http://www.php.net/manual/en/reserved.variables.server.php [$ _SERVER ['PHP_SELF']]には現在_executing_スクリプトが含まれていますが、含まれているファイルから判断する方法はありませんどの特定のスクリプトがインクルードを引き起こしたか。

これは、「a.php」が「c.php」を含む「b.php」を含む場合、「c.php」は「b.php」がインクルーダーであることを知る方法がないことを意味します。 最良の方法は、 `a.php`が現在実行中のスクリプトであることです。

” ” ‘

編集:うん、私の上記の答えは技術的に間違っています-http://php.net/manual/en/function.debug-backtrace.php [debug_backtrace]を使用して、関数がなくても呼び出し元を見つけることができます* upこの機能を削除するPHP 5.4まで*。

a.php:

b.php:

c.php:

出力:

ABCArray
(
    [0] => Array
        (
            [file] => /tmp/b.php
            [line] => 3
            [function] => include
        )

    [1] => Array
        (
            [file] => /tmp/a.php
            [line] => 3
            [args] => Array
                (
                    [0] => /tmp/b.php
                )

            [function] => include
        )

)

したがって、これは機能しますが、おそらく使用すべきではありません。 * `debug_backtrace`は、過度に使用すると、目立ったパフォーマンスドラッグになります。

9


`get_included_files()`は、含まれるファイルのスタックを、含まれる順に提供します。私の場合、必要なものはすべて提供されました。

具体的には、インクルードされたファイル内で「get_included_files()」を呼び出すと、そのファイル自体のファイルパスは、「get_included_files()」によって返されたスタック上の最新のエントリになります。等

注意点は、ファイルは一度しかリストされないため、同じファイルが複数回インクルードされた場合、最初のインクルードのみがスタックに表示されることです。 私の目的ではそれは問題ではありませんでしたが、これは間違いなくこれがすべての場合に機能しないことを意味します。

具体例:「test1.php」に「test_include.php」が含まれているファイルを想像してください。 ブラウザにtest1.phpをロードした後の ‘test_include.php’の観点からのget_included_files()の結果は次のとおりです(おわかりのように、auto_prependファイルがあり、オートローダーがロードされます)。 。

array(4) {
  [0]=>
  string(21) "/www/auto_prepend.php"
  [1]=>
  string(19) "/www/autoloader.php"
  [2]=>
  string(14) "/www/test1.php"
  [3]=>
  string(21) "/www/test_include.php"
}

そのため、test_include.phpは、array_popを少し実行するだけで、誰がインクルードしたかがわかります。

5


`$ _SERVER [‘PHP_SELF’]`は、最初にアクセスしたファイルを指す必要があります。または、必要になる前に変数を設定できます。たとえば:

$section = 'home';
require_once('header.php');

…​

if ($section == 'home') {
    ...
}

3


PHPは、バックトレースに含まれるファイルを追跡します。 小さなヘルパー関数を使用すると、最後のincludeコマンドがあったファイル名を取得できます。

/**
 * get filename that included this file
 *
 * @return string filename
 */
function include_by() {
    $bt = debug_backtrace(0);
    while ($b = array_shift($bt)) {
        if (in_array($b['function'], array('require', 'require_once', 'include', 'include_once'), 1)) {
            return $b['file'];
        }
    }
    throw new BadFunctionCallException('Not an include.');
}

使用法:

main.php:

sub.php:

バックトレースの関連する使用法も参照してください:https://stackoverflow.com/q/190421/367456[PHP 5の呼び出し関数?]。

3


debug_print_backtrace();

PHPドキュメントを確認する

2


Webサーバー環境での最も簡単な方法: `$ _SERVER [‘SCRIPT_FILENAME’]`は、呼び出された元のファイルを表示します。

普遍的な方法-`debug_backtrace()`は実行の以前のすべてのステップを表示します。これにはrequire / include関数の呼び出しが含まれます。

0


タイトルとURLをコピーしました