【PHP】includeやrequireで呼び出されたファイルにて、呼び出し元のファイル名を取得する方法

公開日:
更新日:
カテゴリー: PHP

独自に作成した関数などが記述されたファイルをincludeやrequire関数で呼び出す場合、呼び出される側のファイルで呼び出し元のファイル名などの情報を取得したいときがあります。

ここではその方法をまとめています。

呼び出し元のファイル名を取得する方法

オブジェクト思考というか保守性を重視した場合、まとまった機能は個別ファイルに独自関数という形で保存していると思いますが、これらの関数において「Aファイルから呼び出された場合はこっちの処理をさせたい」「Bファイルから呼び出された場合は処理を中断させたい」など、呼び出し元のファイルによって条件を分岐させたい時があります。

この場合、debug_backtrace関数で呼び出し元のファイル名を取得すれば実現可能です。

debug_backtrace

この関数は、呼び出し元のファイル情報を連想配列で返してくれるものです。詳細はこちら

debug_backtrace();

返り値には、以下のようなものが含まれます。

  • 呼び出し元のファイル名(パス)
  • 呼び出し元が呼び出した行数
  • 呼び出し元が実行した関数や呼び出された関数名
  • 呼び出された関数に渡された引数

呼び出し元のファイル名を出力するサンプル

実際にdebug_backtrace関数を使って呼び出し元のファイル名を出力してみたいと思います。

まずは環境を整理しておきます。「parent.php」は呼び出し元のファイル、「child.php」は呼び出されるファイルです(これらは同一階層にあります)。

parent.php

<?php
//同一階層にある「child.php」を呼び出す
include_once("child.php");
//そのファイルに記述されている「func_test」関数を実行
$value = func_test("なんかの文字列", 12345);
//以下省略
?>

child.php

<?php
//呼び出し元のファイル情報を取得
$associative_array = debug_backtrace();
//ファイル名を出力
echo $associative_array[0]["file"];
//関数を定義
function func_test($string, $number){
	//以下省略
}
?>

この場合、「/home/○○○/www/○○○/parent.php」と出力されます。

このように、includeもしくはrequire関数で呼び出されたファイルにdebug_backtrace関数を使うことで、呼び出し元のファイル名を取得できます。

あとはif構文などで処理を分岐させれば、ファイル名に応じた柔軟な処理が可能になると思います。

実際の返り値

参考までに上のサンプルプログラムの「$associative_array」を展開すると、このようになっています。

Array
(
    [0] => Array
        (
            [file] => /home/○○○/www/○○○/parent.php
            [line] => 3 ※呼び出し元ファイルが(ファイルを)呼び出した行数
            [function] => include_once ※呼び出し元ファイルが呼び出しのために実行した関数
        )

)

備考

<?php
//関数を定義
function func_test($string, $number){
	//呼び出し元のファイル情報を取得
	$associative_array = debug_backtrace();
	//ファイル名を出力
	echo $associative_array[0]["file"];
	//以下省略
}
?>

なお、上のようにdebug_backtrace関数を、呼び出されるファイルのなかに定義している関数の中で使用すると、次のような返り値となります。

Array
(
    [0] => Array
        (
            [file] => /home/○○○/www/○○○/parent.php
            [line] => 5 //呼び出し元ファイルが(関数を)呼び出した行数
            [function] => func_test //呼び出し元ファイルが呼び出した関数
            [args] => Array
                (
                    [0] => なんかの文字列 //第1引数に渡されたデータ
                    [1] => 12345 //第2引数に渡されたデータ
                )

        )

)

 

あわせて読んでほしい!

 

コメント

1:名無しさん:2018/09/17 14:51:40

child.php側に
basename($_SERVER['SCRIPT_NAME'])
一行で済むんですが、、、。

コメントフォーム
お名前
コメント