require_once otro otra llamar include_once funcion entre ejecutar diferencia desde carpeta archivo php include include-path magic-constants

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.