IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[Configuration] chemin d'un fichier dans un include/require


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut [Configuration] chemin d'un fichier dans un include/require
    Bonjour,

    Je suis désolé de vous embêter avec ma question mais je n'ai pas trouvé de réponse dans la FAQ ni dans le forum ou bien dans les tutos ...

    Pour exposer le probléme sur lequel j'en suis sûr, beaucoup d'entre vous ont déjà planché... je vais être bref :

    Je suis en PHP5 et dans un souci d'organisation, j'aimerai ranger un peu l'ensemble de mes fichiers de mon projet . J'ai donc, par exemple créer un dossier CLASSES dans lequel je range toutes mes classes PHP. Lorsque je les appelle en require d'un autre fichier (venant de la racine par exemple, on va l'appeler index.php), je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //index.php
    require_once('classes/MonObjet.class.php');
    Imaginons maintenant cette classe MonObjet appelle également MonObjet2 qui est aussi une classe. Si je veux que le require_once soit correctement interprété lors de l'execution de mon fichier index.php, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //MonObjet.class.php
    require_once('classes/MonObjet2.class.php');
    et ce, même si ces derniers sont dans le même dossier.

    Mon probleme vient donc que, si le fichier appelant MonObjet se situe dans un dossier (index2.php dans le dossier ADMIN par exemple), il n'est plus à la racine et lors de l'execution de celui-ci ... le require_once de index2.php sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //index2.php
    require_once('../classes/MonObjet.class.php');
    Mais jaurai une erreur puisque l'inclusion du fichier MonObjet2 deviendra fausse. (la juste étant ce coup-ci : require_once('../classes/MonObjet2.class.php'))

    Alors ma question ... connaissez vous un moyen de résoudre ce probleme d'include de maniere a ce que je puisse l'appeler de n'importe quel fichier de mon projet sans pour autant tomber sur une erreur de require ... J'ai pensé à trouver une variable définissant la racine de mon projet ... mais je ne sais rééllement pas comment m'y prendre.

    Merci d'avance pour vos réponses!

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Perso, je colle toutes mes classes dans un dossier.
    Dans ce dossier j'ycolle un include.class.php qui inclut mes classes.

    Dans les pages du site front et back je load le include.class.php

    après seulement je commence à instancier mes objets.

    Certains te diront qu'avec ce système PHP compile inutilement certaines classes, c'est vrai, mais bon les pertessont elles dramatique ? Pour le moment je trouve pas.

    bye

  3. #3
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Bah moi j'utilise la balise <base> (à mettre dans l'en-tete).

    Par contre, je ne sais pas si ça va marcher dans ton cas, à tester...

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Bah moi j'utilise la balise <base> (à mettre dans l'en-tete).

    Par contre, je ne sais pas si ça va marcher dans ton cas, à tester...
    uh?

    c'est un parametre html quin'intervient pas lors de la compilation du script par le moteur PHP.

  5. #5
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    J'espere mal comprendre mais je ne vois pas en quoi le problème est changé en fait... car dans ton "include.class.php", tu auras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //include.class.php
    require_once('MonObjet.class.php');
    require_once('MonObjet2.class.php');
    Si j'ai bien compris ton raisonnement...

    Maintenant, reprenons index.php à la racine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //index.php
    require_once('Include.class.php');
    Ce code la ne fonctionnera pas. Il faut donc définir alors Include par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //include.class.php
    require_once('classes/MonObjet.class.php');
    require_once('classes/MonObjet2.class.php');
    dans le but de faire fonctionner les tout.

    Maintenant, avec le même include.class.php, j'ai un fichier index2.php situé dans un dossier admin ... j'aurai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //index.php
    require_once('../classes/Include.class.php');
    et j'obtiendrai une erreur d'execution car le fichier Include.class.php ne fonctionne plus dans ce cas d'appel.

    Si j'ai mal saisi ta methode "d'includation", je veux bien que tu la développes , ca serait cool

  6. #6
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Citation Envoyé par ePoX
    c'est un parametre html quin'intervient pas lors de la compilation du script par le moteur PHP.
    Ah oui, en effet...

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    BizuR,

    j'utilise ce principe sur plusieurs site sans problème :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [classes]
      [maclasse1.php]
      [maclasse2.php]
      [include.class.php]
    [www]
      [index.php] // Appel ../classes/include.class.php
    [gestion]
      [index.php] // Appel ../classes/include.class.php
    et dans include.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?
    include("maclasse1.php");
    include("maclasse2.php");
    ?>
    Après libre à toi de le remettre en cause, je ne m'y oppposerai pas.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    "Une solution" qui marchera (mais qui j'avoue, ne me satisfait pas forcément "pleinement") : utiliser une variable d'environnement

    Dans ton httpd.conf, tu mets, tout a la fin :
    SetEnv CHEMIN_PROJET "/Le/Chemin/Vers/Ma/Racine"

    Et apres, systématiquement, lors d'un include, tu utilises des liens absolus en utilisant cette variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //include.class.php
    require_once($_SERVER['CHEMIN_PROJET']."/classes/MonObjet.class.php");
    require_once($_SERVER['CHEMIN_PROJET']."/classes/MonObjet2.class.php");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // index.php
    require_once($_SERVER['CHEMIN_PROJET']."/classes/Include.class.php");

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Dans ce cas la mieux vos utiliser les constantes PHP car tu peux les définir sur n'importe quel hebergement.

    Alors que la variable apache je ne sais pas si c'est passe partout, j'en doute un peu en fait.

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Et d'ailleurs quitte à utiliser une constante avec un chemin en dur, tu dois surement pouvoir utiliser autoload();

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    oui mais avec les constantes, on revient au même probleme ... a savoir qu'on ne sait pas "où" les définir en premier lieu (on n'a pas de connaissance sur le "scope" courant a priori)

    moi j'ai toujours assimilé un "include" a "copie colle moi le code du fichier inclus à cet endroit"

    Si j'applique cette règle, dans ton archi, on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // /www/index.php
    include_once("../classes/include.class.php");
    qui équivaut strictement à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // /www/index.php
    include("maclasse1.php");
    include("maclasse2.php");
    Or maclasse1.php et maclasse2.php ne se trouvent pas dans /www ! ... ils ne devraient pas être trouvés ... si ?

    EDIT: je ne connais pas "autoload()" ... quoi sé ?

  12. #12
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Tout d'abord merci pour vos réponses.
    EpoX, je ne remet pas en cause ta solution mais je cherchais juste à savoir comment tu t'y prenais.

    Pour la solution que tu me proposes, je note que tu prend un exemple ou les fichiers ont le même niveau d'arborescence dans le projet. Maintenant, si jamais un fichier présent à la racine de ton projet appel le include.class.php (niveau d'arborescence différent)
    je vais toutefois essayer ta solution même si je suis septique quant à la construction de ton include.class.php (septique car j'ai déjà essayé de mettre les liens de cette manière) et reviendrai pour t'en faire un bilan.

    atmaweapon... tu as raison, la solution que tu proposes est intéressante mais elle nécessite une configuration de ton serveur. Hors, si jamais je déploie mon appli sur un serveur que je ne peux configurer, je fais comment ?
    (bon d'après ce que je vois ... je ne suis pas le seul à avoir déjà fait la remarque )

  13. #13
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Un petit tour sur php.net (vu que vous avez l'air de buter)

    http://fr.php.net/include/

    Par exemple, si include_path est ., que le dossier de travail est /www/, et que vous incluez le fichier include/a.php et qu'il y a une instruction include "b.php" dans ce fichier, alors b.php est d'abord recherché dans /www/, puis dans /www/include/.

  14. #14
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Pour la solution que tu me proposes, je note que tu prend un exemple ou les fichiers ont le même niveau d'arborescence dans le projet. Maintenant, si jamais un fichier présent à la racine de ton projet appel le include.class.php (niveau d'arborescence différent)
    un truc du style ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [classes] 
      [maclasse1.php] 
      [maclasse2.php] 
      [include.class.php] 
    [www] 
      [index.php] // Appel ../classes/include.class.php 
    [gestion] 
      [index.php] // Appel ../classes/include.class.php
    [dossierrelou]
       [sousdossierrelour]
           [index.php] // Appel de ../../classes/include.class.php

  15. #15
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    EDIT: je ne connais pas "autoload()" ... quoi sé ?
    Une fonction magique(?)de PHP5 qui permet de charger dynamiquement les classes en lui fournissant un repertoire ou chercher les classes.

    Sa évite de se manger les include, le principe à l'air très sympa à plein d'égard, mais je n'ai pas encore testé personnellement.

    http://fr.php.net/autoload

  16. #16
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    ahah, avec le set_include_path ... la donne est différente en effet. Mais sans cette fonction, es-tu sur que tes fichiers fonctionne ?!?
    car si j'ai bien compris, pour que ca marche, il faut alors faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [classes]
      [maclasse1.php]
      [maclasse2.php]
      [include.class.php] //comme tu le fais dans ton exemple précédent
    [www]
      [index.php] 
              // set_include_path('.;../classes/');
              // Appel include.class.php
    [gestion]
      [index.php] 
             // set_include_path('.;../classes/');
              // Appel include.class.php
    [dossierrelou]
       [sousdossierrelour]
           [index.php] 
              // set_include_path('.;../../classes/');
              // Appel include.class.php
    Je vais essayer cette méthode. Cela pourra peut être m'apporter la solution à mon probleme

    PS: Si tu penses que je fais mauvaise route dans mon exemple, n'hésites pas.

  17. #17
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Oula je l'avais pas capté comme cela le include_path, à vrai dire je ne connaissais pas.

    Je pensais que dans la phrase c'était l'équivalent du dossier d'exec.

    Mais sincèrement tu te compliques la vie avec ce set_include_path.

    En gros, moi ce que j'ai pu remarquer, c'était que quel que soit l'emplacement du script appelant le include.class.php, les include fait à l'intérieur se font par rapport à l'emplacement du fichier include.class.php, pas besoin de se masturber le cerveau.

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Je viens de faire quelques tests... le set_include_path ne me convainc pas plus que ca ... puisque comme l'a dit bizu, il faut spécifier "a la main" le chemin du répertoire pour le scope des include ... et pour moi ca revient au probleme de départ (d'un scope a l'autre, on peut avoir des différences...)

    le autoload, c'est bien ... mais là encore, sans utiliser de liens absolus, c'est pas évident (sauf si on se pose comme contrainte "tous mes scripts 'racine' seront dans le même répertoire" ... contrainte forte a mon avis sur les sites importants)

    Enfin, meme si le set_include_path peut résoudre les problemes ... il présente un gros probleme : on est obligé de se "taper" les includes de chaque classe "a la main" ... c'est a dire que je jour où on rajoute une classe, il faut bien penser a la rajouter dans le script d'includage ...

    Perso, j'utilise des liens relatifs (avec ma méthode de la constante serveur) ce qui me permet de faire un fopen() de mon répertoire des classes et des fichiers includes pour inclure automatiquement tous les fichiers les constituants
    ... et le set_include_path ne marche pas avec le fopen

  19. #19
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Alors, j'ai un erreur lorsque j'utilise ta méthode. En effet, les include sur les fichiers class fonctionnent à ma plus grande surprise. Par contre, j'ai également un fichier de configuration qui doit etre inclus dans une classe ... voici la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [projet]
    [classes]
      [Database.class.php] 
          // a besoin de Database.conf.php
          // comment l'inclure car appel ../config/Database.conf.php ne fonctionne pas
      [User.class.php]
      [Include.class.php]
    [config]
      [Database.conf.php]
    [index.php] 
          //a besoin de Database.class.php
          //appel classes/Include.class.php
    Ici, tout fonctionne mais l'appel au fichier de config échoue (no stream found). Ou le déclarerais tu ?!? car en toute logique, il doit etre déclarer dans le fichier de database.class.php et non autre part. Si je le met dans le Include.class.php, cela ne fonctionne pas non plus

    Merci encore pour ton aide EpoX

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    je précise ... ma solution peut être un peu contournée si on n'a pas les droits d'accès au serveur ...

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // /CONFIG_SITES.php
    $CHEMIN_SITE1 = "/chemin/vers/le/site1";
    $CHEMIN_SITE2 = "/chemin/vers/un/autre/site";
    Systématiquement, dans tous les scripts du "site1", on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    include_once("/CONFIG_SITES.php");
    include_once($CHEMIN_SITE1."/classes/include.class.php");
    Ca rajoute certes une ligne dans chaque script ... mais ca marche
    ... et plus besoin de se casser la tete avec ces satanés liens relatifs ... vive les liens absolus pour les includes ^^

Discussions similaires

  1. [Débutant] configuration spécifique pour un fichier dans un projet
    Par hector2 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 25/07/2012, 01h43
  2. chemin d’accès à un fichier dans res
    Par yasminacha dans le forum Android
    Réponses: 1
    Dernier message: 23/05/2011, 13h09
  3. [XL-2007] renvoi chemin d'un fichier dans une cellule.
    Par Yalou dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/12/2010, 23h27
  4. importer chemin + non du fichier dans une table
    Par popofpopof dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/04/2008, 20h47
  5. Réponses: 2
    Dernier message: 24/08/2007, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo