2009-12-20 25 views
17

Làm cách nào để tìm tên tệp của tập lệnh được gọi là chức năng của tôi?Tìm ra tên tệp được gọi là hàm của tôi trong PHP

Ví dụ,

function sthing() { 
echo __FILE__; // echoes myself 
echo __CALLER_FILE__; // echoes the file that called me 
} 
+0

Bạn có thể vui lòng cung cấp thêm thông tin về lý do tại sao và với mục đích nào bạn cần có chức năng như vậy y? Có thể là bạn đang tiếp cận một vấn đề từ kết thúc sai. – Gordon

Trả lời

29

Một giải pháp có thể sử dụng chức năng debug_backtrace: trong vết lùi mà loại thông tin nên có mặt.

Hoặc, như Gordon đã chỉ ra trong nhận xét, bạn cũng có thể sử dụng debug_print_backtrace nếu bạn chỉ muốn xuất thông tin đó và không hoạt động với thông tin đó.


Ví dụ, với temp.php chứa này:

<?php 
include 'temp-2.php'; 
my_function(); 

và với temp-2.php chứa này:

<?php 
function my_function() { 
    var_dump(debug_backtrace()); 
} 


Calling temp.php(i.e. the first script) từ trình duyệt của tôi được tôi đầu ra này:

array 
    0 => 
    array 
     'file' => string '/.../temp/temp.php' (length=46) 
     'line' => int 5 
     'function' => string 'my_function' (length=11) 
     'args' => 
     array 
      empty 

Ở đó, tôi có tên tệp "temp.php" - là tên tệp mà hàm đã được gọi.


Tất nhiên, bạn sẽ phải kiểm tra thêm một chút (đặc biệt là trong những tình huống mà các chức năng không phải là trong bảng "Cấp đầu tiên" bao gồm tập tin, nhưng trong một tập tin bao gồm bằng nhau - không chắc chắn debug_backtrace sẽ giúp ích nhiều, ở đó ...); nhưng điều này có thể giúp bạn có được một ý tưởng đầu tiên ...

+0

Có thể thêm debug_print_backtrace() vào câu trả lời. – Gordon

+0

@Gordon: cảm ơn đề xuất; Tôi đã chỉnh sửa câu trả lời của mình để thêm câu trả lời đó :-) –

+0

Câu trả lời hay. Giúp dễ dàng tìm kiếm tệp "gọi điện" bắt đầu từ cuối, chỉ cần tìm tệp đầu tiên khác ... – Franz

3

Ngoài đề nghị Pascal Martins, bạn có thể cài đặt phần mở rộng PECL APD và sử dụng giống như apd_callstack(), mà (trích dẫn ví dụ)

// returns an array containing an array of arrays. 

Each array appears to contain: 
[0] = function name 
[1] = filename that contains function 
[2] = *calling* line number in *calling* file 
[3] = An array which is usually empty 

Nhưng kể từ đây là một phần mở rộng PECL và có thể can thiệp vào Trình tối ưu hóa Zend, bạn có thể nên sử dụng debug_backtrace().

0

Bạn có thể vượt qua các tên tập tin như một tham số:

function sthing($filename) { 
    echo __FILE__; // echoes myself 
    echo $filename; // echoes the file that called me 
} 

Khi bạn gọi hàm bạn vượt qua sự kỳ diệu liên tục FILE:

sthing(__FILE__); 
2

Hãy thử điều này:

$key = array_search(__FUNCTION__, array_column(debug_backtrace(), 'function'))); 
var_dump(debug_backtrace()[$key]['file']); 
+0

Hoàn thiện. Hoạt động như mong đợi. – Dovy

+0

Làm việc tốt trên php 5.6. Cảm ơn. –

Các vấn đề liên quan