require_once et chemin relatif...

Discussion dans 'Web, design' créé par k o D, 26 Avril 2008.

Statut de la discussion:
Fermée.
  1. Offline
    k o D Belge !
    Bonsoir à tous.

    Bon mon titre n'est pas vraiment clair je le reconnais... je vais donc tâcher d'être le plus compréhensible :oops: .

    Je finalise un site que j'ai réalisé en PHP5 en utilisant un maximum l'objet.
    Il se trouve maintenant que j'ai lorsque je veux afficher ma page d'index j'obtiens cette erreur:

    Bon clairement un problème de path... parce que j'ai dans ma classe DBFactory ceci:
    PHP:
    require_once("db/DBInterface.php");
    require_once(
    "db/DBException.php");
    require_once(
    "db/MySQL.php");
    Voici l'architecture de mes dossiers:

    [www]
    > [ admin ]
    >> [ db ]
    >>> DBFactory.php
    >>> DBInterface.php
    >>> DBMySQL.php
    >> Toutes mes classes "Bizness" qui appellent sans difficultés ma DBFactory.
    > index.php

    Ma page qui utilise des objets défini dans [admin] qui eux-même appellent DBFactory mais là c'est le drame j'obtiens l'erreur plus haut...

    Alors comment pourrais-je faire pour gérer ses chemins?
    Merci d'avance!

    PS: Je suis certain que c'est tout con mais comme je n'en sais rien je risque de chercher longtemps pour rien... :]
    k o D, 26 Avril 2008
    #1
  2. Offline
    Calvin80 Elite
    Calvin80, 27 Avril 2008
    #2
  3. Offline
    ozilrit Touriste
    Utilise un chemin absolu parce que :
    • c'est plus simp',
    • un chemin relatif oblige le ZE à se situer à chaque appel,
    • le répertoire actuel dépend du script qui a inclus le script qui a inclus le script qui a inclus, etc.
    ozilrit, 27 Avril 2008
    #3
  4. Offline
    ozilrit Touriste
    Vire le require_once également, c'est un boulet.

    if (! class_exist ('Classe')) {
    require '/ma/classe.php';
    }

    Require (tout comme include, return et echo) n'est pas une fonction et ne prend donc pas de parenthèses.
    ozilrit, 27 Avril 2008
    #4
  5. Offline
    k o D Belge !
    C'est ce qu'il me semblait également mais je le vois dans quasiment tous les documents existants donc je me demandais quoi :-'

    Merci bien je vais tester avec des chemins absolus.
    k o D, 27 Avril 2008
    #5
  6. Offline
    ozilrit Touriste
    Errata : ce serait plutôt class_exists().

    De rien.
    ozilrit, 27 Avril 2008
    #6
  7. Offline
    Calvin80 Elite
    + d'info ? thx !
    Calvin80, 27 Avril 2008
    #7
  8. Offline
    Calvin80 Elite
    ne serait-ce pas :
    Require (tout comme include, return et echo) n'est pas une fonction et peut donc ne pas prendre de parenthèses ?
    Calvin80, 27 Avril 2008
    #8
  9. Offline
    ozilrit Touriste
    La fonction redirige simplement vers la structure de language :
    function require ($path) {
    require $path;
    }


    Une condition class_exists va vérifier si la classe est déjà incluse. Oui ? fin. Non ? require.

    Un require_once va lire le fichier, l'interpréter, le hasher, comparer le hash aux autres hashs et enfin décider. Trouvé ? fin. Sinon ? renvoyer le code.
    ozilrit, 27 Avril 2008
    #9
  10. Offline
    Calvin80 Elite
    OK merci pour ces infos !:]
    je vais faire un test de performances pour voir un peu.
    Calvin80, 27 Avril 2008
    #10
  11. Offline
    Calvin80 Elite
    Effectivement, la différence est flagrante
    donne, à peu près,
    par contre
    donne, à peu près,
    Calvin80, 27 Avril 2008
    #11
  12. Offline
    ozilrit Touriste
    =] =] =]
    ozilrit, 27 Avril 2008
    #12
  13. Offline
    k o D Belge !
    Ouche oui mechant!
    Je vais modifier ça demain.
    k o D, 27 Avril 2008
    #13
  14. Offline
    k o D Belge !
    Bon et bien je ne m'en sors pas... :pfiou:

    Le chemin absolu m'est interdit, je ne sais en effet pas du tout le futur nom de domaine utilisé ni quoi que ce soit (serveur windows ou linux?).
    Donc je dois le faire avec un chemin relatif.

    Mais j'avoue que je ne comprend pas du tout comment set_include_path(""); fonctionne...
    Je fais des tests depuis tout à l'heure mais je n'y parviens pas :pfiou:
    Un bon petit exemple pour m'aider?

    Voici les cas auquel je suis confronté:

    > fichier index qui va chercher des fichiers dans le dossier admin, nusoap etc...
    > [admin]
    >> page allant chercher une autre page du même répertoire.
    >> page allant chercher mon fichier config.php à la racine.
    >> page allant chercher 1 fichier dans le dossier ../nusoap/lib.
    >> page allant chercher une autre page dans le dossier /db
    >> [db]
    >>> page devant aller chercher le fichier config.php à la racine
    > [nusoap]
    >>[lib]
    k o D, 28 Avril 2008
    #14
  15. Offline
    ozilrit Touriste
    Pourquoi ne stockes-tu pas le chemin vers l'application dans une variable ou une constante tout simplement ?
    ozilrit, 28 Avril 2008
    #15
  16. Offline
    k o D Belge !
    Oui d'accord mais j'avoue ne pas comprendre du tout le mécanisme...

    D'après ce que je comprend, quand je prend ma page index (en racine) et que j'appelle ma page "Objet" dans le dossier admin qui elle-même fait appel à ma page "DB" dans le dossier admin/db le require présent dans ma page "Objet" ira chercher à partir de la racine de mon site étant donné que c'est dans ma page index que j'effectue le require vers ma page "Objet".

    index -> admin/Object.php -> admin/db/DB.php

    Le problème est que j'ai également des pages dans d'autres dossiers qui font appel à Objet (et donc forcément à DB). Par exemple:

    admin/indexAdmin -> admin/Object.php -> admin/db/DB.php

    Et là et bien le chemin à la base de l'appel n'est plus la racine mais /admin.

    J'avoue ne pas saisir comment je peux arranger ce problème... ou alors si, dans admin je place $chemin = "admin/" et dans admin/indexAdmin je place $chemin=""
    Bien entendu ce n'est pas aussi simple vu que par exemple admin/db/DB.php inclus config.php qui est à la racine du site...

    index -> admin/Object.php -> admin/db/DB.php -> config.php
    admin/indexAdmin -> admin/Object.php -> admin/db/DB.php -> config.php

    Une fois que j'aurai compris le mécanisme çà ira mieux mais là je suis perdu :-'
    k o D, 28 Avril 2008
    #16
  17. Offline
    ozilrit Touriste
    Mais pourquoi te forces-tu à utiliser des chemins relatifs ?
    ozilrit, 28 Avril 2008
    #17
  18. Offline
    k o D Belge !
    Parce que je ne connais pas le chemin absolu. :-D
    k o D, 28 Avril 2008
    #18
  19. Offline
    ozilrit Touriste
    echo dirname(__FILE__);
    ozilrit, 28 Avril 2008
    #19
  20. Offline
    k o D Belge !
    Ok bon j'utilise ce système et çà fonctionne nickel... sauf pour mon fichier de configuration qui se trouve à la racine.

    J'ai fais un exemple simpliste pour montrer ce à quoi je veux arriver.

    Page testpath à la racine de mon serveur:
    PHP:
    require dirname(__FILE__).'/admin/include.php';
    echo 
    '<br/>A partir de la racine du serveur';
    Page include dans le dossier admin:
    PHP:
    echo '1 - ',dirname(__FILE__).'/db/DBInterface.php<br/>';
    echo 
    '2 - ',dirname(__FILE__).'../config.php<br/>';
    echo 
    '3 - ',dirname(__FILE__.'../config.php'),'<br/>';
    echo 
    '4 - ',realpath('../config.php'),'<br/>';
    echo 
    '5 - ',__FILE__,'<br/>';
    Page testpath2 dans le dossier admin comme include:
    PHP:
    require dirname(__FILE__).'/include.php';
    echo 
    '<br/>A partir du même dossier que include';
    Bien entendu, la ligne 2 et 3 sont "folkloriques" mais c'est vraiment pour montrer ce que j'aimerai obtenir...
    Parce que la difficulté vient que cette page include se fera appeler par des pages provenant de la racine mais aussi par des pages étant dans le même répertoire... le tout pour 1 fichier de configuration qui lui se trouvera d'office à la racine!

    PS: j'ai même d'autres dossiers dans admin avec des pages qui appelleront également config.php :]
    k o D, 29 Avril 2008
    #20
Statut de la discussion:
Fermée.