Tengo problemas para comprender el conjunto de reglas con respecto a las rutas de inclusión relativas de PHP. Si ejecuto el archivo A.PHP- y el archivo A.PHP incluye el archivo B.PHP que incluye el archivo C.PHP, si la ruta relativa a C.PHP está relacionada con la ubicación de B.PHP o con la ubicación de A .PHP? Es decir, ¿importa desde qué archivo se llama la inclusión, o solo cuál es el directorio de trabajo actual y qué determina el directorio de trabajo actual?
php
include
relative-path
Yarin
fuente
fuente
Respuestas:
Es relativo al script principal, en este caso A.php. Recuerde que
include()
solo inserta código en el script que se está ejecutando actualmente.No.
Si desea que sea importante y hacer una inclusión relativa a B.php, use la
__FILE__
constante (o__DIR__
desde PHP 5.2 IIRC) que siempre apuntará al archivo actual literal en el que se encuentra la línea de código.fuente
__DIR__
para ese propósito exacto.include(dirname(__FILE__)."/C.PHP");
, porqueinclude("C.PHP");
es suficiente (¡Sí! C.PHP puede estar en el mismo directorio que B.PHP) Puede fallar solo cuando hay dos archivos C.PHP en su proyecto.@Pekka me llevó allí, pero solo quiero compartir lo que aprendí:
getcwd()
devuelve el directorio donde reside el archivo que comenzó a ejecutar.dirname(__FILE__)
devuelve el directorio del archivo que contiene el código que se está ejecutando actualmente.Con estas dos funciones, siempre puede crear una ruta de inclusión relativa a lo que necesita.
por ejemplo, si b.php y c.php comparten un directorio, b.php puede incluir c.php como:
sin importar desde dónde se haya llamado a b.php.
De hecho, esta es la forma preferida de establecer rutas relativas, ya que el código adicional libera a PHP de tener que iterar a través de include_path en el intento de localizar el archivo de destino.
Fuentes:
¿Diferencia entre getcwd () y dirname (__ FILE__)? ¿Qué debo usar?
Por qué debería usar dirname (__ FILE__)
fuente
Si la ruta de inclusión no comienza con
./
o../
, por ejemplo:Si la ruta de inclusión comienza con
./
o../
, por ejemplo:El
.
o..
superior es relativo agetcwd()
, que por defecto es la ruta del.php
archivo de entrada (es decirA.php
).Probado en PHP 5.4.3 (Fecha de compilación: 8 de mayo de 2012 00:47:34).
(También tenga en cuenta que
chdir()
puede cambiar la salida degetcwd()
).fuente
chdir(__DIR__)
para solucionar el problema.getcwd()
, que por defecto es la ruta del archivo .php de entrada, [...] no necesariamente cierto. Si ejecuto PHP en la línea de comandos, entonces segetcwd()
refiere al directorio de trabajo actual del shell, independientemente del.php
archivo que invoque. Sin embargo, puedo imaginar que si PHP se ejecuta en un entorno de servidor web, el entorno inicializa el directorio de trabajo actual en el.php
archivo de entrada . Probado en macOS con PHP 7.2.2 instalado a través de Homebrew.La respuesta aceptada de Pekka es incompleta y, en un contexto general, engañosa. Si el archivo se proporciona como una ruta relativa, la construcción del lenguaje llamado
include
lo buscará de la siguiente manera.Primero, pasará por las rutas de la variable de entorno
include_path
, que se puede configurar conini_set
. Si esto falla, buscará en el directorio del script de llamadadirname(__FILE__)
(__DIR__
con php> = 5.3.) Si esto también falla, ¡solo entonces buscará en el directorio de trabajo! Resulta que, de forma predeterminada, la variable de entornoinclude_path
comienza con.
, que es el directorio de trabajo actual. Esa es la única razón por la que busca primero en el directorio de trabajo actual. Consulte http://php.net/manual/en/function.include.php .Entonces, la respuesta correcta a la primera parte de la pregunta es que sí importa dónde se encuentra el script de llamada incluido. La respuesta a la última parte de la pregunta es que el directorio de trabajo inicial , en un contexto de servidor web, es el directorio del script llamado, el script que incluye todos los demás mientras es manejado por PHP. En un contexto de línea de comandos, el directorio de trabajo inicial es lo que sea cuando se invoca php en el indicador, no necesariamente el directorio donde se encuentra el script llamado. El actual directorio de trabajo, sin embargo, se puede cambiar en tiempo de ejecución con la función de PHP
chdir
. Consulte http://php.net/manual/en/function.chdir.php .Este párrafo se agrega para comentar otras respuestas. Algunos han mencionado que confiar en
include_path
es menos robusto y, por lo tanto, es preferible utilizar rutas completas como./path
o__DIR__ . /path
. Algunos fueron tan lejos como para decir que confiar en el directorio de trabajo en.
sí no es seguro, porque se puede cambiar. Sin embargo, algunas veces, debe confiar en los valores del entorno. Por ejemplo, es posible que desee establecerloinclude_path
vacío, de modo que el directorio del script de llamada sea el primer lugar en el que buscará, incluso antes del directorio de trabajo actual. Es posible que el código ya esté escrito y actualizado periódicamente desde fuentes externas y no desea volver a insertar el prefijo__DIR__
cada vez que se actualice el código.fuente
dirname(__FILE__)
(__DIR__)
con php> = 5.3.)" ¿Estás seguro? ¿Dónde está documentado? Espero que esté equivocado, y PHP no usa__FILE__
y__DIR__
para este propósito, ya que eso rompería rápidamente la inclusión de scripts "hermanos" de los enlazados simbólicamente . : -o (Lo que, afortunadamente, parece funcionar bien aquí, en mi configuración 7.1.)Respuesta corta: es relativa al guión incluido.
TFM lo explica correctamente:
Entonces, si /app/main.php dice
include("./inc.php")
que encontrará /app/inc.php .El ./ no es estrictamente necesario, pero elimina cualquier dependencia de include_path.
No confiaría en encontrar archivos de inclusión en el directorio de trabajo actual en caso de que alguien lo cambie con
chdir()
.fuente
./
, ¿verifica primero el directorio del script de llamada o primero el directorio de trabajo actual?./
. es decir, chdir ("/ app / other") hará queinclude("./inc.php")
falle. Por lo tanto, useinclude("inc.php")
para estar seguro en este caso.Para incluir
a
enb
lo que necesitainclude("../a.php");
Para incluir
b
enc
lo que necesitainclude("dir2/b.php");
fuente