2009-12-20 15 views
17

¿Cómo puedo encontrar el nombre de archivo del script que llamó a mi función?Encontrar el nombre de archivo que llamó mi función en PHP

Por ejemplo,

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

¿Podrían darnos más información sobre por qué y con qué propósito necesitarían tal funcionalidad? y? Puede ser que estés abordando un problema desde el lado equivocado. – Gordon

Respuesta

29

Una solución podría ser utilizar la función debug_backtrace: en la traza, 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 lo siguiente:

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

y con temp-2.php que contiene lo siguiente:

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


Calling temp.php(i.e. the first script) de mi navegador me pone 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 nombre de archivo "temp.php", que es el nombre en el que se ha llamado a la función.


Por supuesto, usted tiene que probar un poco más (especialmente en situaciones en las que la función no se encuentra en el "primer nivel" archivo incluido, pero en un archivo incluido por otro - no estoy seguro debug_backtrace ayudará mucho, allí ...); pero esto podría ayudarle a obtener una primera idea ...

+0

Quizás agregue debug_print_backtrace() a la respuesta también. – Gordon

+0

@Gordon: gracias por la sugerencia; Edité mi respuesta para agregar esa :-) –

+0

Buena respuesta. Hace que sea fácil buscar el archivo de "llamada" comenzando al final, solo buscando el primer archivo que sea diferente ... – Franz

3

Además de la sugerencia de Pascal Martins, usted podría instalar la extensión PECL APD y usar algo como apd_callstack(), que (citando ejemplo)

// 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 desde esta es una extensión PECL y podría interferir con Zend Optimizer, es mejor que vayas con debug_backtrace().

0

Puede pasar el nombre de archivo como un parámetro:

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

Cuando se llama a la función que pasan la magia constante ARCHIVO:

sthing(__FILE__); 
2

Prueba esto:

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

Perfección. Funciona como se esperaba – Dovy

+0

Trabajando bien en php 5.6. Gracias. –

Cuestiones relacionadas