2009-11-26 30 views
10

Tôi biết hằng số ma thuật __FILE__ trong PHP sẽ biến thành đường dẫn đầy đủ và tên tệp của tệp hiện đang thực thi. Nhưng có cách nào tôi có thể nhận được cùng một thông tin cho tập tin gọi của một hàm không? Ví dụ:Nhận hằng số __FILE__ cho người gọi hàm trong PHP

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

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

sẽ xuất Calling file: ....../foo.php.

Tôi biết không có hằng số ma thuật __CALLING_FILE__ hoặc hằng số ma thuật để xử lý việc này, nhưng có cách nào để tôi có thể nhận được thông tin đó không? Giải pháp ít tốn kém nhất sẽ là lý tưởng (ví dụ: sử dụng một dấu vết ngăn xếp sẽ là khá hacky) nhưng cuối cùng tôi chỉ cần nó để làm việc.

+3

tôi ước này có thể được thực hiện w/o quay lui – Geo

Trả lời

21

bạn nên xem xét dấu vết ngăn xếp để thực hiện những việc như vậy. PHP có một chức năng gọi là debug_backtrace

include "bar.php"; 
call_it(); 

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

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

hy vọng nó sẽ giúp

trên cùng một nguyên tắc bạn có thể tìm debug_print_backtrace hữu ích, nó làm những điều tương tự nhưng php xử lý các định dạng và in ấn của tất cả các thông tin của chính nó.

+0

ổn, vì vậy tôi cho rằng PHP stack trace tiện ích thân thiện hơn tôi mong đợi nó được, và điều này có vẻ là cách sạch để làm những gì tôi muốn. –

3

debug_backtrace() là bạn của bạn

Đó là những gì chúng tôi sử dụng để đổ stack trace đầy đủ cho các hiện dòng. Để điều chỉnh trường hợp của bạn, hãy bỏ qua phần đầu của $trace mảng.

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'; 
    } 
} 
Các vấn đề liên quan