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

  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
    Points : 3 947
    Points
    3 947
    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
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  2. #2
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    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
    Points : 3 947
    Points
    3 947
    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
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  4. #4
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    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
    Expert éminent sénior

    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
    Points : 17 778
    Points
    17 778
    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 éminent sénior

    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
    Points : 10 726
    Points
    10 726
    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
    Points : 3 947
    Points
    3 947
    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 ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  8. #8
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par stealth35
    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
    C'est la grosse tuile alors ?
    Faudrait donc tout renommer en minuscule si je comprends bien ? (pour < 5.3.3 en tout cas)
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    non, rien ne t'empêche de faire ton autoload custom

    l'autoload normale c'est dans l'idéal, tu me diras a part pour faire joli pourquoi mettre des majuscules dans les nom de fichier ?

    mais sur les distrib normales j'ai pas eu de soucis a se niveau (meme le ZF2 c'est en majuscule)

    pour ton exemple ca ne marchera pas non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    namespace public\application\vues;
    self::$instVue = new public\application\vues\Accueil();
    d'ailleur ca sert a rien de doubler

    sois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    namespace public\application\vues;
    self::$instVue = new Accueil();
    sois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self::$instVue = new public\application\vues\Accueil();
    mais peu importe le chemin il attendra que le fichier sois du namespace : public\application\vues

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace public\application\vues;
     
    class Accueil {}

  10. #10
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Ouf, ça y est ... il était temps.
    Comme dirait l'autre, ça comprend vite mais faut expliquer longtemps

    Vu l'heure, je me contente que ça charge quelques classes, mais fallait vraiment commencer par le début, définir les namespace une par une.

    Mais je sens que je suis pas au bout de mes peines, car j'ai remarqué un truc bizarre.

    Si je défini le chemin comme ça par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    namespace communs\classes;
    classe RcException extends Exception { ... }
    Apparemment, l'autoload recherchera aussi la classe Exception dans communs\classes
    En faisant de l'autre manière, soit $uneClasse = new communs\classes\UneClasse() ça marche.
    Du moins, c'est ce que j'ai remarqué.


    Puis là, j'ai pas encore vérifié, mais je crains le pire pour une classe qui aurait que des méthodes statiques, donc appel de méthodes sans instanciation.
    Je me dis que je n'aurais pas d'autre choix que le 1er cas, de définir le namespace dans le fichier de la classe.
    Si par malheur ça étend une classe de Php, l'autoload la recherchera dans le chemin qu'a défini le namespace.

    Enfin, je fabule peut être un peu.
    J'vais m'coucher, ça vaut mieux.


    Merci encore pour le coup d'main en tout cas
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  11. #11
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    pour ton problème y'a 2 écoles
    tout les classes PHP (pour le moment) font partie du namespace \

    par exemple :
    ca a l'avantage d'être simple mais il faut réécrire ca dans tes classes

    ou

    utiliser use

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use \PDO;
    $pdo = new PDO();
    je suis plus du coté de use, parce que ca ressemble au java ou a l'as3 au niveau du import

    a toi de voir, pour le ZF2 c'est la 1ere méthode pour le moment

  12. #12
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    C'est la misère ... j'vais attraper la migraine dans peu d'temps

    La bonne vieille méthode de nomage unique en les préfixant me semble largement plus simple que cette histoire de namespace (à la noix).
    Ca prends l'choux j'vous dis pas comment

    Déjà, ma riche idée de nommer mon répertoire public n'en était pas une, public est un mot réservé apparemment (du moins pour les namespace).
    J'ai renommer ça publique, ça ira mieux à mon avis.


    Je fais une récap.
    L'index.php est appelée en tout 1er, puis j'instancie une classe Config.
    Ici, pas de namespace puisque la classe est incluse directement.
    Cette classe appel set_include_path(), et contient une méthode Config::autoloadClass() et c'est défini avec spl_autoload_register().

    A savoir que la classe Config est dans : publique/classes/Config.php
    Et que c'est l'enfant de ConfigCom dans : communs/classes/ConfigCom.php

    La 1ère classe qui est appelée par l'autoload est PdoMySQL, et je croyais que c'était bon alors que ça ne l'est pas du tout finalement.

    A l'instant j'ai effectué les choses ainsi (mais essayé tout et n'importe quoi) :
    Dans index.php il y a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $Conf = new Config();
    $Conf->initConfig();
    Et dans le initConfig :
    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
    18
    19
     
    public function initConfig() {
        $this->loadConstantes();           // import : config.xml
        $this->initCharset();              // Défini le charset par defaut
        $this->initTimezone();             // Défini la zone horaire
        $this->initConfigMbString();       // fonction mb_string / charset
        $this->initConfigErrors();         // mode débug / ini_set(...) (true ou false)
        self::$PDO = self::getPdoMySQL();  // Instance PdoMySQL
        self::$PDO->setTables(); // Stockage/Initialisation des tables dans la BDD
        $this->loadConfigDB();   // Initialise la liste des configurations de la BDD
        $this->loadPagesDB();    // Initialise la liste des pages de la BDD
    }
     
    public static function getPdoMySQL() {
        if (self::$PDO instanceof PdoMySQL == NULL) {
            self::$PDO = communs\classes\PdoMySQL::getInstance();
        }
        return self::$PDO;
    }
    Concernant PdoMySQL :
    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
     
    namespace communs\classes;
    use \PDO, \PDOException;
     
    class PdoMySQL extends PDO {
     
        public function __construct() {
            self::$instancePdo = parent::__construct(blablabla);
            var_dump(self::$instancePdo);
            $this->setAttribute(self::ATTR_ERRMODE, self::ERRMODE_EXCEPTION);
            $this->setAttribute(self::ATTR_STATEMENT_CLASS, array('communs\classes\PdoStmt'));
            PdoStmt::setPDOInstance($this);
            $this->exec('SET NAMES utf8', __FILE__, __LINE__);
        }
    }
    Comme ça, le var_dump(self::$instancePdo) me renvoie NULL.
    Donc ça veut dire que l'autoload à bien inclus PdoMySQL, mais rien pour le parent PDO ???
    Pourtant, j'ai bien précisé use \PDO.

    Si je supprime cette ligne : namespace communs\classes;, c'est PdoMySQL qui n'est pas trouvé.
    Mais ce que je n'arrive pas à comprendre, c'est que le message d'erreur renvoie :
    Fatale erreur : Class 'communs\classes\PdoMySQL' not found
    Php recherche au bon endroit pourtant.
    De plus j'ai un echo dans l'autoload qui m'indique le bon chemin : communs\classes\PdoMySQL.php


    Je ne pige pas.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  13. #13
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    deja tu peux fair un try..catch autour de
    self::$instancePdo = parent::__construct(blablabla);

    ton index.php est a quelle niveau par rapport au communs/classes/ConfigCom.php


    EDIT : ca serait plus comme ca
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    namespace communs\classes;
    use \PDO, 
    	\PDOException, 
    	\PDOStatement;
     
    class PdoMySQL extends PDO
    {	
        public function __construct()
        {
            parent::__construct('mysql:host=localhost;dbname=', 'root');	       
            $this->setAttribute(self::ATTR_ERRMODE, self::ERRMODE_EXCEPTION);
            $this->setAttribute(self::ATTR_STATEMENT_CLASS, array('communs\classes\PdoStmt'));
            //PdoStmt::setPDOInstance($this);
            $this->exec('SET NAMES utf8');	        
        }
     
        public static function getInstance()
        {
        	$class = __CLASS__;
        	return new $class;
        }
    }
     
    class PdoStmt extends PDOStatement
    {
     
    }
     
    $pdo =  PdoMySQL::getInstance();
    var_dump($pdo);

  14. #14
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    deja tu peux fair un try..catch autour de
    self::$instancePdo = parent::__construct(blablabla);
    C'est là aussi un peu le drame, car normalement il n'y a pas besoin de try/catch car la Config prévoit une gestion des erreur/exception, ça attrape tout (set_error_handler et set_execption_handler).
    Mais avec les namespace, tout part en sucette.
    Un comble pour une gestion des erreurs


    Le Config ce trouve dans un disque à part : D:/sites/Run/publique/classes/Config.php
    Toute l'application se trouve là, du moins je suis justement en train basculer ici au fur et à mesure.

    Le index.php dans C:/wamp/www/siteWeb/index.php qui est le Host.

    Coté serveur tout sera dans le même espace disque, mais malgré tout les choses seront quand même séparées (application et virtualhost).

    J'essai de comprendre un peu, mais je ne suis pas sûr de l'adopter, car ça m'a l'air d'un compliqué, ou un peu prématuré.


    En tout cas, ça fonctionne pour les 2 ou 3 classes que je dirais simples, mais c'est PDO qui pose vraiment problème, et pareil pour les Exception.
    Les classes étendues avec celles du de Php pose plus problème apparemment.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  15. #15
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    il faut mettre D:/sites/Run dans ton included_path
    sinon pour les exception c'est ok

    par contre ton code n'etait pas bon
    self::$instancePdo retournais de tout façon null

    EDIT : je te ferai un petit exemple de ptojet avec des namespaces

  16. #16
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    il faut mettre D:/sites/Run dans ton included_path
    Ca y est depuis toujours, donc c'est Ok.

    En faite, le namespace fonctionnent en partie, c'est vraiment PDO où jusqu'à lors j'y arrive à rien.

    Par contre, la gestion des erreurs et exception ça fonctionne en grande partie, il y a apparemment juste la méthode afficherMessage() qui bug.
    Dans celle ci j'appel une méthode de Config::isErrHeader() qui bizarrement est considéré comme un autre Objet, du coup l'autoload() tente de l'inclure à nouveau.

    Tout ça est quand même assez particulier, ça demande de la pratique.


    EDIT : je te ferai un petit exemple de ptojet avec des namespaces
    C'est sympa.
    Mais bon, je découvre à peine, j'ai encore plein d'essais à faire pour tenter de comprendre un peu plus.


    Je vais essayer d'ailleurs d'instancier PdoMySQL de manière plus directe, sans passer par le Config.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  17. #17
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Ca y est

    Pas sûr que ce soit la meilleur façon de procéder, mais à l'heure actuelle, impossible de faire autrement.

    J'ai conservé les lignes au niveau de PdoMySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    namespace communs\classes;
    use \PDO, \PDOStatement, \PDOException;
    Mais ce qui provoquait des erreurs d'exceptions, et surtout que l'autoload tentait d'inclure la classe PDO à partir de communs/classe, ce que je n'arrivais pas à piger d'ailleurs, c'est le fait d'avoir utilisé les constantes de classe PDO::FETCH_ASSOC au lieu de PdoMySQL::FETCH_ASSOC entre autre.
    Tout portait à croire que c'était un problème de chemin, de namespace. Ben non.
    Un truc de dingue quoi (c'est bateau je dirais même).


    Maintenant faudrait que je pousse plus loin ma gestion des erreurs, car ça doit être du même genre.


    Concernant le var_dump(self::$instancePdo) que tu parlais précédemment, ça renvoie NULL effectivement.
    En faite, le parent::__construct() ne renvoie rien, donc ça risquait pas, mais après coup j'avais fait un var_dump($this), et grâce à ça j'ai pu voir quand PdoMySQL était instancié.


    Ceci dit, c'est juste une bataille de réussie, reste la guerre, et j'ai vraiment l'impression que je ne suis pas au bout de mes peines.
    Déjà 4 aspirines pour ce soir ...


    Grand merci pour ton aide en tout cas
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  18. #18
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Bon, ce que je présentais se confirme, ça me fais faire beaucoup trop de modifs en mettant en place les namespace.
    Le méthode des préfixes pour résoudre les noms communs sera nettement plus simple et plus rapide.

    Le coté positif que je remarque néanmoins, c'est peut être de déceler des problèmes de conception qu'il y aurait dans le projet.


    Je donne un cas réel pour exemple.

    J'ai une classe ConfigCom (dans communs/classes) qui est le parent de Config (dans publique/classes).
    L'idée est que ce qui ce trouve dans "communs" est le coté FrameWork.
    Les classes enfants dans "publique" c'est le siteWeb, donc s'il y a un 2ème projet il y aura une 2ème classe Config avec ces propre config.

    Même principe pour le routage : RouteurCom (parent dans communs) et Routeur (enfant dans publique).

    Le problème que je rencontre à cet instant, c'est que dans le index.php j'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Config::getRouteur()->routage();
    Celui ci fonctionne très bien avec l'autoload, sans les namespace.
    Mais j'ai idée qu'il y aurait un problème de conception, car en faite, j'ai une méthode ConfigCom::getRouteur(), elle se trouve dans ConfigCom et nondans Config.
    Ca veut dire que le Parent ConfigCom appel directement l'enfant du routage, donc Routeur, et ensuite appel la méthode routage().
    Ce que je me dis, c'est que le Parent ConfigCom ne serait pas censé connaitre Routeur, à la limite RouteurCom.

    M'enfin, à l'heure actuel c'est conçu comme ça, et Php perd un peu ses petits avec l'autoload + namespace.


    Bref.
    Il me semble avoir compris les principes de base des espaces de nom (grâce à ton aide ), mais là le truc est beaucoup trop avancé pour mettre ça en place du jour au lendemain (mise à par les nombreuses âneries qu'il doit avoir).
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

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