J'écrivais une application web en PHP, quand j'ai rencontré une situation étrange. Pour illustrer mon problème, envisager une application web de cette structure:Comment fonctionne la résolution de chemin dans require_once?
/
index.php
f1/
f1.php
f2/
f2.php
Contenu de ces fichiers:
index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("../f2/f2.php"); ?>
f2.php: vide
maintenant, quand je tente d'ouvrir index.php dans mon navigateur je reçois cette erreur:
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
Y at-il quelque chose d'évident, je suis absent? comment inclure les chemins fonctionnent en PHP?
Avant de poser cette question, j'ai tenté d'expérimenter et de découvrir. Je mis en place un autre test, comme ceci:
/
index.php
f1/
f1.php
f2.php
index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("f2.php"); ?>
f2.php: blank
À ma grande surprise (et confusion totale), cela a bien fonctionné!
Alors, quel est le secret derrière la résolution du chemin? PS J'ai vu this question, mais il ne répond toujours pas au deuxième cas que j'ai indiqué ici.
J'ai déjà contourné ce problème (en utilisant dirname). Ce que je veux savoir, c'est pourquoi le second cas n'échoue pas. Est-ce un bug ou une fonctionnalité? – jrharshath
Édité ma réponse pour couvrir le deuxième exemple. – Karsten
Je ne trouve pas la page de manuel qui documente l'appel réussi à require_once ('f2.php') à partir de f1.php. Les docs disent que include_path est ignoré quand aucune information de chemin n'est fournie (quoi que ce soit, supprimer '.' De include_path n'a aucun effet) et getcwd() montre que le répertoire de travail est le même tout autour de la chaîne d'inclusion. Sérieusement, cela ressemble à une fonctionnalité non documentée. –