Averiguar el nombre de archivo que llamó a mi función en PHP

3 minutos de lectura

¿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
}

  • ¿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

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

avatar de usuario
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_columnpuede 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'];
}

avatar de usuario
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__);

¿Ha sido útil esta solución?