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

Langage PHP Discussion :

Espace de nom (namespace) pour éviter les conflits


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut Espace de nom (namespace) pour éviter les conflits
    Bonjour à tous (ou bonsoir)

    Voilà, j'ai lu des tonnes de truc sur les espaces de noms, mais ça n'imprime pas (ça n'entre pas)

    Pourtant, il va me falloirs m'y mettre, car je vais avoir des conflits entre des noms de classes identiques à cause d'un autoload.

    Je vous donne un cas concret selon mon arborescence (qui pour le moment est en local).
    D:/sites/Run/public/application/controllers/accueil.php (Une classe)
    D:/sites/Run/public/application/vues/accueil.php (une classe)
    Le autoload a un principe assez simple, c'est une succession de if(file_existe(...)) et require_once().
    En 1er ça vérifie dans le répertoire "controllers", et si ça y est pas, le répertoire "vues".

    Ca va donc causer un problème lorsque que je vais instancier les Vues (Accueil par exemple).
    Pour la vue par exemple, j'ai un code comme ceci (à peu près) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (file_exists(DIR_LIBRAIRIE.ESPACE.'/application/vues/'.$classe.'.php') == false) throw new RcException('... erreur ...');
    if (self::$instVue == NULL) {
        self::$instVue = $classe::getInstance();
    }
    Bon, j'ai toujours l'option de renommer les controllers/vues, genre les préfixer, mais comme tout est déjà goupillé, ça m'embête un peu.

    Il me semble qu'il faut définir le chemin quelque part, dans la classe je suppose, et au moment de l'instanciation, mais je ne vois pas du tout comment.
    Est ce que les namespace c'est vraiment fait pour gérer ce genre de cas d'ailleurs ?


    Si vous avez un petit temps à m'accorder, j'en serais ravi

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    l'autoload ca va chercher directement le fichier

    si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $test = new My\Framework\Test();
    il ira chercher My\Framework\Test.php dans le include_path et a partir dossier en cours

    pas besoin de faire de file_exist

    tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    new Controllers\Accueil()
    new Vues\Accueil()
    si ton application est dans ton include_pass

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    l'autoload ca va chercher directement le fichier

    si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $test = new My\Framework\Test();
    il ira chercher My\Framework\Test.php dans le include_path et a partir dossier en cours
    A ben zut alors, c'est aussi simple que ça ?

    Tu parle du include_path.
    J'ai de mon coté défini quelques chemins clé avec set_include path, dans mon exemple : D:/sites/Run/public
    Mais pas au-delà (pas application ni vu).

    Bon je n'est qu'à essayer, mais cette manière de faire est elle liée directement à ce qu'il y a dans le include_path ?


    Merci pour cette réponse très rapide

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    ouai comme le reste, sois c'est a coté, sois dans le include_path

    t'aura juste a lancer spl_autoload_register() et voila vendu


    faut bien sur avoir le namespace pour tes class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace My\Framework;
     
    class Test {*}

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Attention, la fonction par défaut d'autoload :

    Tout ceci n'étant pas visible sur un système Windows (dû à l'insensibilité de la casse du FS et au cas particulier où le séparateur natif de répertoire correspond au caractère de namespace).

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par julp Voir le message
    Attention : la fonction par défaut d'autoload :
    • n'est pas portable/bugguée en PHP < 5.3.3
    • applique un strtolower au nom complet de la classe pour une classe My\Framework\Test, c'est my/framework/test.[inc|php] qui serait cherché

    Tout ceci n'étant pas visible sur un système Windows (insensibilité à la casse du FS et séparateur de répertoire correspondant au caractère de namespace).
    j'avais demander a ce qu'on vire le strtolower, on ma jamais répondu
    parce que dans les phar tout système confondu c'est sensible a la casse

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    faut bien sur avoir le namespace pour tes class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace My\Framework;
     
    class Test {*}
    Ok, je me disais bien que ça n'était si automatique que ça.

    N'empêche que c'est un peu la chi**e , car jusqu'à lors j'utilise des chemins complets (malgrè le set_include_path), puis aucun namespace n'est défini.
    Pour le spl_autoload_register(), c'est ainsi que ça se fait.


    Va falloir commencer par le début à mon avis, soit la 1ère classe, mais j'ai idée que ça va l'faire.
    Pour le 1er essai, la classe n'est pas trouvée.


    Par rapport auX cheminS que j'ai mis au 1er post, et par rapport au set_include_path() (D:/sites/Run/).
    ça devrait être : namespace public\application\vues\
    Puis : self::$instVue = new public\application\vues\Accueil();
    Comme ça, non ?

Discussions similaires

  1. comment faire pour éviter les scroller dans une page quelque soit la résolution
    Par ghou67 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 09/11/2007, 09h15
  2. [XsL/xpath]Comment faire pour éviter les doublons?
    Par BigBarbare dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/05/2007, 20h31
  3. Réponses: 2
    Dernier message: 28/06/2006, 08h53
  4. Réponses: 2
    Dernier message: 13/11/2005, 18h03

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