2009-11-26 2 views
10

PHPの__FILE__マジック定数が現在実行中のファイルのフルパスとファイル名に変わることは知っています。しかし、関数の呼び出しファイルに対して同じ情報を得る方法はありますか?たとえば、PHPの関数の呼び出し側の__FILE__定数を取得

//foo.php: 
include "bar.php"; 
call_it(); 

//bar.php 
function call_it() { 
    echo "Calling file: ".__CALLING_FILE__; 
} 

Calling file: ....../foo.phpを出力します。

私は__CALLING_FILE__のマジック定数、またはこれを処理するための魔法の定数がないことを知っていますが、その情報を得る方法はありますか?最もハックの少ないソリューションは理想的です(スタックトレースを使用するとかなりハッキリです)が、結局は動作させるだけです。

+3

私は、これは、W/O – Geo

答えて

21

このようなことを行うには、スタックトレースを調べる必要があります。 PHPは

include "bar.php"; 
call_it(); 

//bar.php 
function call_it() { 
    $bt = debug_backtrace(); 

    echo "Calling file: ". $bt[0]['file'] . ' line '. $bt[0]['line']; 
} 

debug_backtraceが、それはあなたがdebug_print_backtrace便利な、それが行うのと同じものを見つけることができますが、PHPは、それ自体ですべての情報を整形して印刷を扱う同じ原理に

を役に立てば幸いと呼ばれる機能を持っています。

+0

無事をバックトレース行われることを希望するので、私はPHPのスタックトレースユーティリティは、私はそれがあることが予想よりも親しみやすいです、これは私が欲しいものを行うためのクリーンな方法であると思われると仮定します。 –

3

debug_backtrace()たちは現在ラインの完全なスタックトレースをダンプするために使用するものですあなたの友人

です。あなたのケースに合わせて調整するには、$trace配列の上部を無視してください。

class Util_Debug_ContextReader { 
    private static function the_trace_entry_to_return() { 
     $trace = debug_backtrace(); 

     for ($i = 0; $i < count($trace); ++$i) { 
      if ('debug' == $trace[$i]['function']) { 
       if (isset($trace[$i + 1]['class'])) { 
        return array(
         'class' => $trace[$i + 1]['class'], 
         'line' => $trace[$i]['line'], 
        ); 
       } 

       return array(
        'file' => $trace[$i]['file'], 
        'line' => $trace[$i]['line'], 
       ); 
      } 
     } 

     return $trace[0]; 
    } 

    /** 
    * @return string 
    */ 
    public function current_module() { 
     $trace_entry = self::the_trace_entry_to_return(); 

     if (isset($trace_entry['class'])) 
      return 'class '. $trace_entry['class']; 
     else 
      return 'file '. $trace_entry['file']; 

     return 'unknown'; 
    } 

    public function current_line_number() { 
     $trace_entry = self::the_trace_entry_to_return(); 
     if (isset($trace_entry['line'])) return $trace_entry['line']; 
     return 'unknown'; 
    } 
} 
関連する問題