How do I find out the filename of the script that called my function?
For example,
function sthing() { echo __FILE__; // echoes myself echo __CALLER_FILE__; // echoes the file that called me }
How do I find out the filename of the script that called my function?
For example,
function sthing() { echo __FILE__; // echoes myself echo __CALLER_FILE__; // echoes the file that called me }
A solution might be to use the debug_backtrace
function : in the backtrace, that kind of information should be present.
Or, as Gordon pointed out in a comment, you can also use debug_print_backtrace
if you just want to output that information and not work with it.
For instance, with temp.php
containing this :
<?php include 'temp-2.php'; my_function();
and with temp-2.php
containing this :
<?php function my_function() { var_dump(debug_backtrace()); }
Calling temp.php
(i.e. the first script)
from my browser gets me this output :
array 0 => array 'file' => string '/.../temp/temp.php' (length=46) 'line' => int 5 'function' => string 'my_function' (length=11) 'args' => array empty
In there, I have the "temp.php
" filename -- which is the one in which the function has been called.
Of course, you'll have to test a bit more (especially in situations where the function is not in the "first level" included file, but in a file included by another one -- not sure debug_backtrace
will help much, there...) ; but this might help you get a first idea...
In addition to Pascal Martins's suggestion, you could install the PECL extension APD and use something like apd_callstack(), which (quoting example)
// 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
But since this is a PECL extension and might interfere with Zend Optimizer, you might be better off going with debug_backtrace().
Try this:
$key = array_search(__FUNCTION__, array_column(debug_backtrace(), 'function'))); var_dump(debug_backtrace()[$key]['file']);
You can pass the filename as a parameter:
function sthing($filename) { echo __FILE__; // echoes myself echo $filename; // echoes the file that called me }
When you call the function you pass the magic constant FILE:
sthing(__FILE__);