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 :

[POO] Problème d'instanciation au sein d'une autre classe


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 10
    Points : 9
    Points
    9
    Par défaut [POO] Problème d'instanciation au sein d'une autre classe
    Bonjour bonjour,

    Comme le titre du message ne l'explique peut être pas tout à fait clairement, j'essaie d'instancier un objet dans une autre classe et j'ai un soucis...

    J'explique, j'ai une classe qui gère les écritures au sein d'un fichier xml, xmlManager, elle marche parfaitement.

    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
     
    class xmlManager {
     
    private $document;
     
    public function __construct ($parametre1, $parametre2, ...) {
       $this->document =  new DomDocument();
    }
     
    public function addMessage($message) {
        //ajoute un message à l'arbre XML
    }
     
    public function saveMessages() {
        $this->document->save($myfile);
    }
    }
    et j'ai mon autre classe, qui hérite de PDO et dans laquelle j'aimerai instancié un objet du type xmlManager, afin de pouvoir consigner dans un journal au format xml les requêtes, les erreurs etc... sans m'en préoccuper, c'est à dire en manipulant un objet PDO normal, la journalisation en plus.

    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
     
    class PDOjournalise extends PDO {
     
    private $log;
     
    public function __construct() {
        $this->log = new xmlManager;
        try {
            $dbObject = parent::__construct($dns,$username,$password);
            $message = 'Connection réussie !';
        } catch (PDOException $exection){
            $message = 'Echec de la connection :'.$exception->getMessage();
        }
        $this->log->addMessage($message);
        return $dbObject;
    }
     
    public function __destruct() {
        $this->log->addMessage('Fermeture du lien !');
        $this->log->saveMessages();
    }
    }
    Mon problème est le suivant : si une exception se déclenche (si je met un mauvais mot de pass par exemple et qu'il n'arrive pas à se connecter à la base de données), je reçoit un message du type :
    Fatal error: Call to a member function addMessage() on a non-object in c:\mon_dossier\PDOjournalise.class.php on line XX
    alors que si il n'y a pas d'exception, tout marche parfaitement.

    J'ai fait des tests avec cette fonction là comme constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function __construct() {
        $log = new xmlManager;
        try {
            $dbObject = parent::__construct($dns,$username,$password);
            $message = 'Connection réussie !';
        } catch (PDOException $exection){
            $message = 'Echec de la connection :'.$exception->getMessage();
        }
        $log->addMessage($message);
        $this->log = $log;
        return $dbObject;
    }
    Je récupère dans ce cas le même message, à ceci près que le numéros de ligne correspond ce coup ci à l'appel suivant de $this->log->addMessage, appel qui a lieu dans une autre fonction de la classe (dans le destructeur par ex)...

    Voilà, ça fait 4 heure que je cherche dans tous les sens, que j'essai des trucs pas possible (à noter qu'une solution serais de stocker les message dans un tableau, et de tous les ajouter à la fin, mais j'aimerai bien savoir pourquoi ça marche pas quand même...). Je suis en train de craquer C'est d'autant plus bizarre quand la classe xmlManager, j'ai pus instancier un objet Domdocument et le stocker dans un attributs sans qu'il râle :/

    Merci de m'avoir lut jusqu'au bout

    PS : question subsidiaire, est ce que le return $dbObject; est nécessaire dans le constructeur de la classe PDOjournalise ?

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    Hihi j'ai aussi créer une classe qui à le même nom XMLManager. Sinon pour ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->log = new xmlManager;
    Sa marche sans les parenthèses ? et paramètres ? Je ne pense pas que ton objet soit créer avec cette ligne sinon il ne te dirai pas cette erreur ^^. Même si tu ne met pas de paramètre il faut mettre les ()

    et aussi :
    Il ne faut pas mettre de return dans un constructeur car il le fait lui même en te renvoyant l'objet complet. Tu peut mettre $dbObject en attribut de classe et utilise directement $this->log.


    P.S. : N'oublie pas qu'il faut impérativement inclure la classe XmlManager avant la classe l'utilisant.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par meliandah
    Hihi j'ai aussi créer une classe qui à le même nom XMLManager. Sinon pour ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->log = new xmlManager;
    Sa marche sans les parenthèses ? et paramètres ? Je ne pense pas que ton objet soit créer avec cette ligne sinon il ne te dirai pas cette erreur ^^. Même si tu ne met pas de paramètre il faut mettre les ()
    Oui, dans mon script elles y sont, j'ai juste oublier de les mettre ici quand j'ai simplifier le code.

    Citation Envoyé par meliandah
    et aussi :
    Il ne faut pas mettre de return dans un constructeur car il le fait lui même en te renvoyant l'objet complet. Tu peut mettre $dbObject en attribut de classe
    ok pour le constructeur, je ne comprend pas l'interet de mettre $dbObject en attribut de la classe :/ ce n'est pas correcte d'appeler les méthode de la classe parente ? Par exemple pour la méthode query j'aurai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function query($sql) {
        //on mémorise la requête pour les logs.
        //en réalité il y a plus de paramètres
        $this->log->addMessage($sql); 
        return parent::query($sql);
    }
    Citation Envoyé par meliandah
    et utilise directement $this->log.
    c'est justement ça qui me pose problème, en cas d'exception, c'est comme si l'attribut log était devenu autre chose car je ne peux plus acceder aux méthodes de ma classe xmlManager


    Citation Envoyé par meliandah
    P.S. : N'oublie pas qu'il faut impérativement inclure la classe XmlManager avant la classe l'utilisant.
    Je ne l'ai pas refait ici pour alléger, mais j'ai bien un require_once 'xmlManager.class.php' en tête de fichier.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbObject = parent::__construct($dns,$username,$password);
    Remplace "parent" par le nom de la classe ou se trouve le constructeur pour être sûr, et pour $dbObject il faut que tu le stocke quelque part mais ne le retourne pas car tu entre en conflit avec le constructeur, il retourne déjà un objet et il ne pourra pas renvoyer deux choses.

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci pour les précisions sur le constructeur.

    J'ai retravailler sur le code, et j'ai fini par décider de ne plus faire hériter la classe PDOjournalise de PDO mais d'instancier un objet PDO directement dedans, le constructeur est modifié ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function __construct($dns,$username,$password) {
        $this->log = new xmlManager();
        try {
            $this->db = new PDO($dns,$user,$password);
            $message = 'Connection réussie !';
        } catch (PDOException $exection){
            $message = 'Echec de la connection :'.$exception->getMessage();
        }
        $this->log->addMessage($message);
    }

    Cela fonctionne, je n'aurai qu'a implementer des fonctions qui s'utilise comme celle de l'objet PDO en appelant d'une part le xmlManager pour la journalisation et d'auter part l'objet PDO pour les requêtes.

    J'ai effectuer quelque tests cela semble fonctionner même si c'est moins élégant. au niveau des performance, j'ignore ce que cela va donner. Qu'en pensez vous ?

  6. #6
    Membre éprouvé
    Avatar de viviboss
    Profil pro
    Inscrit en
    Août 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Août 2006
    Messages : 943
    Points : 1 248
    Points
    1 248
    Par défaut
    Sinon, ce genre d'erreurs arrive aussi chez moi pour ma connection BDD et la méthode mysqli fetch_assoc() : il se trouve qu'il faut blinder les conditions d'utilisation, car si il y a le moindre pet de travers, il ressort un "....ce n'est pas un objet...."

    Donc, blinde du coté des conditions, ca pourrait bien marcher (du style, dans ta classe xmlManager dans ton constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ($parametre1==null || $parametre2==null......){
    throw new Exception ("parametres pas bon");
    }else{
    $this->document=new DomDocument();
    }
    Les conditions dans le construct sont très importante, et t'éviteront bien des déboires !!!!

    edit : perso, je commencerais ma ou mes classes comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class machin{
    private $document=null;
    }
    Comme ca, si le document ou les parametres n'existent pas, par défaut la variable est formaté à null....

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Les paramètres founis au constructeur étaient bon, j'ai émis l'hypothèse que comme la classe hérité de PDO, l'emission d'une PDOException perturbé le déroulement du script ou quelque chose comme ça...

    Pour finir j'ai juste fait un nouvel objet PDO dans mon constructeur, que je mémorise en tant qu'attribut, et j'ai défini des méthode exec, query, quote, prepare (plus prepareAndExecute, ce qui me permet d'enregistrer la requête type, les paramètres, et les erreurs, car avec le fonctionnement de prepare il eu fallut que je redéfinisse la classe PDOStatement aussi).

    Merci pour vos réponses donc.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] [POO] Définition de Méthodes au sein d'une classe Objet
    Par ghada97 dans le forum MATLAB
    Réponses: 7
    Dernier message: 29/11/2013, 18h31
  2. Réponses: 16
    Dernier message: 30/01/2008, 15h27
  3. [POO] problème d'instanciation automatique de classe
    Par Slade991 dans le forum Langage
    Réponses: 10
    Dernier message: 22/12/2007, 15h23
  4. Réponses: 8
    Dernier message: 29/06/2006, 14h54
  5. [POO] Problème lors de l'appel d'une propriété d'un objet.
    Par akecoocoo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/08/2005, 08h51

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