Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Include & require

4 réponses
Avatar
mezigue
Bonjour,
je suis entrain de faire une crise sur mes require.
Selon l'endroit où je fais appel à mes bibliothèques elles fonctionnent ou
pas.

Je fais des requires en relatif.

J'ai trois rep

tests
classes
packages

bon j'ai un fichier dans chacun
tests.php
classes.php
pakages.php

je fais un require de classes.php dans tests.php
require ("../classes/classes.php");

Si j'execute tests.php, ca fonctionne.
Imaginons que j'ai un repertoire au dessus de cette arborescence nommé toto

et un fichier toto.php dedans.
je fais un require de classes.php : require ("./classes/classes.php");
et ben là classes .php n'est plus foutu de trouver son packages.php.

Alors voilà, existe t il une solution, car dev una appli avec une contrainte
pareille c'est vraiment la zone. Ce donne envie de tout mettre à plat dans
un repertoire.
Je pense que je ne dois pas savoir comment faire, car si c'est une
limitation du langage...


Merci

4 réponses

Avatar
CrazyCat
mezigue wrote:
Si j'execute tests.php, ca fonctionne.
Imaginons que j'ai un repertoire au dessus de cette arborescence
nommé toto

et un fichier toto.php dedans.
je fais un require de classes.php : require ("./classes/classes.php");
et ben là classes .php n'est plus foutu de trouver son packages.php.


Il faut partir du principe que lorsque tu fais un include, le fichier inclus
n'est pas considéré comme étant séparé du fichier appelant.
En clair, si toto.php appelle ./test/test.php, les includes depuis test.php
doivent avoir un chemin relatif partant de la position de toto.php.

Ce qui donne donc:
toto.php => include("./test/test.php");
test.php => include("./classes/classes.php");

Par contre, si tu veux lancer test.php seul, le chemin relatif est bien
../classes/classes.php

Heureusement, tu as une petite astuce en PHP: include_path
Dans ton fichier de configuration commun (si tu en as un), tu crée la
variable:
include_path = "./test/:./classes/:./includes/";
c'est le meme principe que la variable path du DOS, le séparateur étant : au
lieu de ;
Ensuite, il ne te reste qu'a appeler tes fichiers sans indiquer de chemin,
et php cherchera seul ou peuvent bien se trouver ces fichiers.
--
CrazyCat from C-P-F.org

Avatar
Michel BONZI
Bonjour,
Ajoute cette ligne dans le fichier .htaccess du répertoire de tes programme
:
php_value include_path ".:/tests/:/classes/:/includes/"
(le : sert de délimiteur pour windows, ; pour linux, il faut indiquer le
chemin complet vers les répertoires
Salutations.

---
Michel BONZI

Avatar
KEvin
CrazyCat a proclame :
Il faut partir du principe que lorsque tu fais un include, le fichier inclus
n'est pas considéré comme étant séparé du fichier appelant.
En clair, si toto.php appelle ./test/test.php, les includes depuis test.php
doivent avoir un chemin relatif partant de la position de toto.php.

Ce qui donne donc:
toto.php => include("./test/test.php");
test.php => include("./classes/classes.php");

Par contre, si tu veux lancer test.php seul, le chemin relatif est bien
../classes/classes.php

Heureusement, tu as une petite astuce en PHP: include_path
Dans ton fichier de configuration commun (si tu en as un), tu crée la
variable:
include_path = "./test/:./classes/:./includes/";


la je suis pas trop d'accord sur le principe (mais je reconnais que ca
marche, attention !) :
- la modification du include_path est une sorte de bidouille qui risque
de rendre ton script moins portable : il faudra penser a changer les
includes path a chaque fois ...
- tu devras rajouter tout les repertoires susceptibles de contenir des
fichiers inclus ce qui est lourd a maintenir
- si tu as des fichiers de meme nom dans des repertoires differents tu
ne pourras pas acceder a un des deux

je preconise plutot une bonne organisation de tes scripts, soit par
l'inclusion d'un fichier commun (le seul a etre relatif) contenant les
repertoires dont tu as besoin, soit d'utiliser:
define('rep_actu',dirname(__FILE__));
qui te donne le repertoire du fichier courant
puis de faire tes include avec:
include(rep_actu.'../toto.php');
comme ca tant que les chemins relatifs ne changent pas tu pointera sur
le bon fichier.


mais bon c'est un choix de style personnel ...





--
KEvin

Avatar
CrazyCat
KEvin wrote:
je preconise plutot une bonne organisation de tes scripts, soit par
l'inclusion d'un fichier commun (le seul a etre relatif) contenant les
repertoires dont tu as besoin, soit d'utiliser:


Cela est vrai pour tout, includes ou pas: organiser *intelligement* son
arborescence :)

define('rep_actu',dirname(__FILE__));
qui te donne le repertoire du fichier courant
puis de faire tes include avec:
include(rep_actu.'../toto.php');
comme ca tant que les chemins relatifs ne changent pas tu pointera sur
le bon fichier.


le dirname(__FILE__) donne le repertoire courant du fichier include? c'est
une bonne chose à savoir, merci du tuyaux.

mais bon c'est un choix de style personnel ...


Très franchement, les astuces que j'ai donné étaient pour débloquer, car je
n'ai moi-même aucun de ces problèmes: mes sites comportent en général 3 ou 4
pages web à la racine (hormis besoins spéciaux tels qu'interfaces d'admin,
applets et autres) et fonctionnent avec des get :)
--
CrazyCat from C-P-F.org