otra - llamar funcion php desde otro php
Obtener el nombre del archivo de llamada de include() (4)
Deseo obtener el nombre del archivo que incluye otro archivo dentro del archivo incluido.
Sé que existe la constante mágica __FILE__
, pero eso no ayuda, ya que devuelve el nombre del archivo incluido , no el incluido .
¿Hay alguna manera de hacer esto? ¿O es imposible debido a la forma en que se interpreta PHP?
En realidad, este es solo un caso especial de lo que hacen los motores de plantillas de PHP. Considera tener esta función:
function ScopedInclude($file, $params = array())
{
extract($params);
include $file;
}
Entonces A.php
puede incluir C.php
así:
<?php
// A.php
ScopedInclude(''C.php'', array(''includerFile'' => __FILE__));
Además, B.php
puede incluir C.php
la misma manera sin problemas.
<?php
// B.php
ScopedInclude(''C.php'', array(''includerFile'' => __FILE__));
C.php
puede conocer su inclusión mirando en la matriz de $ params.
<?php
// C.php
echo $includerFile;
No puedo encontrar la manera fácil de cubrir esto. Pero si incluir uno es realmente importante para ti, puedes hackearlo con alguna variable global y tu propia función de inclusión.
p.ej
<?php
$g_including_files = array();
function my_include($file) {
$bt = debug_backtrace();
global $g_including_files;
$g_including_files[basename($file)] = $bt[0][''file''];
return include($file);
}
Que eso te sea útil :)
Entonces esta pregunta es bastante antigua, pero estaba buscando la respuesta y después de $_SERVER[''SCRIPT_FILENAME''];
insatisfecho, me encontré con $_SERVER[''SCRIPT_FILENAME''];
Por supuesto, esto funciona si el archivo php haciendo el include es una página web.
Esto le proporciona la ruta completa del "archivo incluido" en el servidor. por ejemplo, /var/www/index.php. así que si solo quieres el nombre del archivo, por ejemplo index.php, necesitarás usar basename () ej.
basename($_SERVER[''SCRIPT_FILENAME'']);
Entonces, si en su index.php tiene la siguiente línea:
<?php include("./somephp.php"); ?>
y en somephp.php tienes
echo "this is the file that included me: " . basename($_SERVER[''SCRIPT_FILENAME'']);
conseguirás
this is the file that included me: index.php
salida al navegador. Esto también funciona si el usuario está accediendo a su archivo sin incluir explícitamente el nombre de archivo en la url, por ejemplo, www.example.com
lugar de www.example.com/index.php
.
Solución
Sabiendo que las funciones utilizadas para incluir archivos son include
, include_once
, require
y require_once
, también sabiendo que son palabras reservadas en PHP, lo que significa que no será posible declarar las funciones del usuario con el mismo nombre y basadas en la idea de wedgwood de usar debug_backtrace
realidad puede trabajar desde qué archivo se llamó el include.
Lo que vamos a hacer es iterar sobre la traza inversa hasta que encontremos la llamada más reciente a cualquiera de las cuatro funciones de inclusión, y el archivo al que se llamó. El siguiente código demuestra la técnica:
function GetIncludingFile()
{
$file = false;
$backtrace = debug_backtrace();
$include_functions = array(''include'', ''include_once'', ''require'', ''require_once'');
for ($index = 0; $index < count($backtrace); $index++)
{
$function = $backtrace[$index][''function''];
if (in_array($function, $include_functions))
{
$file = $backtrace[$index][''file''];
break;
}
}
return $file;
}
El código anterior devolverá la ruta absoluta del archivo donde ocurrió la última inclusión, si no ha habido ninguna inclusión, devolverá falsa. Tenga en cuenta que el archivo puede haber sido incluido desde un archivo que se incluyó desde otro archivo, la función anterior solo funciona para la inclusión más profunda.
Con una simple modificación, también puede obtener el último archivo incluido:
function GetIncludedFile()
{
$file = false;
$backtrace = debug_backtrace();
$include_functions = array(''include'', ''include_once'', ''require'', ''require_once'');
for ($index = 0; $index < count($backtrace); $index++)
{
$function = $backtrace[$index][''function''];
if (in_array($function, $include_functions))
{
$file = $backtrace[$index - 1][''file''];
break;
}
}
return $file;
}
Observaciones
Tenga en cuenta que __FILE__
no es el archivo incluido, sino el archivo actual. Por ejemplo:
archivo A.php:
<?php
function callme()
{
echo __FILE__;
}
?>
archivo B.php:
<?php
include(''A.php'');
callme();
?>
archivo index.php:
<?php
include(''B.php'');
?>
En el ejemplo anterior, en el contexto del archivo B.php, el archivo incluido es B.php (y el archivo incluido es index.php) pero el resultado de la callme
función es la ruta de A.php porque __FILE__
está en A .php.
También tenga en cuenta que $_SERVER[''SCRIPT_FILENAME'']
dará la ruta absoluta a la secuencia de comandos solicitada por el cliente. Si $_SERVER[''SCRIPT_FILENAME''] == __FILE__
significa que el archivo actual es el solicitado, y por lo tanto, probablemente no haya habido ninguno ...
El método anterior comprueba si el archivo actual es el solicitado, pero no si no se ha incluido (a continuación se muestra un ejemplo de cómo se puede incluir el archivo solicitado). Una solución real para comprobar si no ha habido ninguna inclusión podría ser verificar el count(get_included_files()) == 1
.
El archivo solicitado puede ser un archivo incluido de la siguiente manera:
archivo x.php
<?php
$var = ''something'';
include(''index.php'');
?>
archivo index.php
<?php
if (!isset($var))
{
include(''x.php'');
exit;
}
echo ''something'';
?>
En el ejemplo anterior, el archivo index.php incluirá x.php, luego x.php incluirá index.php, luego index.php genera "something" y devuelve control a x.php, x.php devuelve control para indexar .php y alcanza la salida;
Esto muestra que incluso si index.php era el script solicitado, también se incluía desde otro script.