Estaba escribiendo una aplicación web en PHP, cuando me encontré con una situación extraña. Para ilustrar mi problema, considere una aplicación web de esta estructura:¿Cómo funciona la resolución de ruta en require_once?
/
index.php
f1/
f1.php
f2/
f2.php
contenido de estos archivos:
index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("../f2/f2.php"); ?>
f2.php: en blanco
ahora, cuando intento abrir index.php en mi navegador me sale este error:
Warning: require_once(../f2/f2.php) [function.require-once]:
failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2
Fatal error: require_once() [function.require]:
Failed opening required '../f2/f2.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/reqtest/f1/f1.php on line 2
¿Hay algo obvio que me falta? ¿Cómo funcionan las rutas incluidas en PHP?
Antes de hacer esta pregunta, intenté experimentar y descubrir. I fijó otra prueba, así:
/
index.php
f1/
f1.php
f2.php
index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("f2.php"); ?>
f2.php: blanco
Para mi sorpresa (y completa confusión), ¡todo salió bien!
Entonces, ¿cuál es el secreto detrás de la resolución de ruta?
PD Vi this question, pero todavía no responde el segundo caso que he mencionado aquí.
Ya he eludido este problema (usando dirname). Lo que quiero saber es por qué el segundo caso no falla. ¿Es un error o una característica? – jrharshath
Edité mi respuesta para cubrir el segundo ejemplo. – Karsten
No puedo encontrar la página de manual que documenta la llamada exitosa a require_once ('f2.php') desde f1.php. Los documentos dicen que include_path se ignora cuando no se proporciona información de ruta (lo que sea, eliminar "." De include_path no tiene ningún efecto) y getcwd() muestra que el directorio de trabajo es el mismo en toda la cadena de inclusión. En serio, parece una característica no documentada. –