0

そこで、デバッグメッセージをその場でログに記録できるメソッドを作成しようとしています。メッセージが発生したファイル名と行番号を含めたいと思います。私の最初の傾向は、現在のファイル名と行番号を含む配列を返すloggingメソッドの引数の1つとしてdebug_backtrace()を指定することでした。

問題は、これは(index.php)と呼ばれる最初のファイルのファイルと行のみを提供することです。index.phpは、インクルードされたファイルのクラスからメソッドを呼び出す5行のファイルにすぎないため、行とファイルの情報は、何があっても常に(index.php、5行目)と表示され、役に立ちません。

コードのどこにいても、現在の行とファイルを取得する方法はありますか?

添加

ファイルと行の情報は次のとおりです。

[2011-01-23 06:26:10]情報: "存在しないコントローラー(テスト)に対してリクエストが行われました。"、ファイル: "/home/spotless/public_html/mymvc/index.php"、行:5、リクエスト: "/テスト"

index.php全体は次のとおりです。

<?php

    include_once('application/init.php');
    lev_init::init();
?>

init.phpファイル内のdebug_backtrace()を使用したロギング呼び出しは次のとおりです(37行目)。

// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', debug_backtrace());

2回目の更新

debug_backtraceのvar_dump

array(1){[0] => array(6){["file"] => string(42) "/home/spotless/public_html/mymvc/index.php" ["line"] => int(5 )["function"] => string(4) "init" ["class"] => string(8) "lev_init" ["type"] => string(2) "::" ["args"] = > array(0){}}}

4

2 に答える 2

2

関数ではなく、これを使用してグローバルコンテキストにいる場合、表示されるのは通常の動作です。ファイルを含めることは、呼び出しスタックには反映されません。関数とメソッドの呼び出しのみが反映されます。

私の知る限り、「インクルードトレース」を作成する方法はありません。ネストされたインクルードのリストには、コード行が含まれています。これはSOで繰り返し尋ねられ、IIRCでは解決策が見つかりませんでした。

于 2011-01-24T00:46:13.487 に答える
1

debug_backtrace配列を返すので、var_export(debug_backtrace(), true)

すなわち:

// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', var_export(debug_backtrace(), true));

ノート:

スタックトレースが重要なもの/場所を編集するだけです。

<?php
// filename: /tmp/a.php

function b_test($foo)
{
   var_dump(debug_backtrace());
}

function a_test($str)
{
    echo "\nHi: $str";
    b_test('bar');
    var_dump(debug_backtrace());
}

a_test('friend');
?>

<?php
// filename: /tmp/b.php
include_once '/tmp/a.php';

?>

b_testのdebug_backtraceは、インクルードまでのすべてを表示します。a_testにあるものは、戻ってきたため、b_test呼び出しを表示しません...

于 2011-01-24T00:35:37.463 に答える