¿Cómo averiguo el nombre de archivo del script que llamó a mi función?
Por ejemplo,
function sthing() {
echo __FILE__; // echoes myself
echo __CALLER_FILE__; // echoes the file that called me
}
Una solución podría ser utilizar el debug_backtrace
función: en el backtrace, ese tipo de información debería estar presente.
O, como señaló Gordon en un comentario, también puede usar debug_print_backtrace
si solo desea generar esa información y no trabajar con ella.
Por ejemplo, con temp.php
que contiene esto:
<?php
include 'temp-2.php';
my_function();
y con temp-2.php
que contiene esto:
<?php
function my_function() {
var_dump(debug_backtrace());
}
Vocación temp.php
(i.e. the first script)
desde mi navegador me obtiene esta salida:
array
0 =>
array
'file' => string '/.../temp/temp.php' (length=46)
'line' => int 5
'function' => string 'my_function' (length=11)
'args' =>
array
empty
Ahí tengo el “temp.php
” nombre de archivo, que es aquel en el que se ha llamado a la función.
Por supuesto, tendrás que probar un poco más. (especialmente en situaciones en las que la función no está en el archivo incluido de “primer nivel”, sino en un archivo incluido por otro, no estoy seguro debug_backtrace
ayudará mucho, ahí…) ; pero esto podría ayudarte a tener una primera idea…
-
Tal vez agregue debug_print_backtrace() a la respuesta también.
– Gordon
20 de diciembre de 2009 a las 13:50
-
@Gordon: gracias por la sugerencia; Edité mi respuesta para agregar esa 🙂
– Pascal MARTÍN
20 de diciembre de 2009 a las 13:53
-
Buena respuesta. Facilita la búsqueda del archivo de “llamada” comenzando por el final, solo buscando el primer archivo que es diferente…
– Francisco
20 de diciembre de 2009 a las 14:00
Mirko Pagliai
Prueba este código:
$key = array_search(__FUNCTION__, array_column(debug_backtrace(), 'function'));
var_dump(debug_backtrace()[$key]['file']);
-
Perfección. Funciona como se esperaba.
– Dovy
1 oct 2017 a las 0:10
-
Si tu php no incluye
array_column
puede usar este polyfill: stackoverflow.com/a/27422723/1203805– usuariolond
3 de abril de 2018 a las 2:20
Además de la sugerencia de Pascal Martins, podrías instalar la extensión PECL DPA y usa algo como apd_callstack()que (ejemplo de cita)
// 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
Pero dado que esta es una extensión PECL y puede interferir con Zend Optimizer, es mejor que utilice debug_backtrace().
2 líneas – hecho:
$backfiles=debug_backtrace();
echo $file_called_from=$backfiles[0]['file']; // complete filepath
O para recortar solo el nombre del archivo, agregue lo siguiente
echo "<Br>";
echo basename($file_called_from); // for only the filename without the path
Esto imprime file_name:line
function myFunction() {
$backfiles = debug_backtrace();
echo $backfiles[0]['file'] . ':' . $backfiles[0]['line'];
}
Arthur Colombini Gusmão
Puede pasar el nombre del archivo como parámetro:
function sthing($filename) {
echo __FILE__; // echoes myself
echo $filename; // echoes the file that called me
}
Cuando llamas a la función, pasas la constante mágica EXPEDIENTE:
sthing(__FILE__);
¿Podría dar más información sobre por qué y con qué propósito necesitaría dicha funcionalidad? Puede ser que esté abordando un problema desde el lado equivocado.
– Gordon
20 de diciembre de 2009 a las 14:22
Para dar un ejemplo: require con rutas relativas carga archivos desde el directorio raíz, incluso si invoca require en un subdirectorio. tener que anteponer DIRECCIÓN a cada llamada requerida podría ocultarse con una función de contenedor, pero luego DIRECCIÓN apuntaría al directorio de la función contenedora, no al destinatario.
– Lajos Mészáros
24 de febrero de 2020 a las 12:53