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] is_object() ou objet vide


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut [POO] is_object() ou objet vide
    Bonjour,

    Voila j'ai une classe qui a pas mal d'attribut objet.
    Dans mon projet ces objet ne sont pas obligatoire donc ils peuvent ne pas etre instanciés .. ainsi je me retrouve a faire plein de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if( is_objet(MonObjet->getMonAutreObjet()){
     a= MonObjet->getMonAutreObjet()->getA();
    }
    Ma question est la suivante : est ce qu'il est mieux de créer des objets vides ou de faire tous les test if(is_object(..)){...} ?

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 301
    Points : 15 622
    Points
    15 622
    Par défaut
    montre nous un exemple d'attribut qui n'est pas toujours instancié

  3. #3
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Ca manque d'exemple effectivement, alors je me lance dans une suggestion au hasard :

    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
     
     
    class Element {
     
      // Proprietes
      $objet_1 = NULL;
      $objet_2 = NULL;
      $objet_3 = NULL;
      $objet_4 = NULL;
      $objet_5 = NULL;
     
      public function __construct() {
     
        // ton constructeur
     
      }
     
      public function actionElement {
     
        if ($this->objet_1) return TRUE;
        else return FALSE;
     
      }
     
      // ...
     
    }
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut Exemple
    Tout bêtement j'ai une classe FORMULAIRE qui prend en private o_auteur

    o_auteur est un objet d'une classe USER

    imaginons que le formulaire peut etre anonyme et que par exemple il est possible de ne pas remplir le champ qui aurait instancier l'objet o_auteur qui aurait fait x traitements pour x raisons.

    lors de l'enregistrement du formulaire dans la base si je veux enregistrer son nom,
    je ferais quelque chose du genre : $MonForm->get_o_auteur()->get_name()
    ainsi si le champ n'est pas rempli, j'ai une magnifique fatal error qui me dit que j'utilise une méthode d'une classe sur un non - objet.

    Dès lors je suis obligé d'ajouter une condition avec is_objet() pour savoir si $MonForm->get_o_auteur() est un objet ou j'instancie l'objet quoi qu'il arrive sauf que si le champ n'est pas renseigné, j'instancie un objet vide.


    ça m'arrive X fois dans mon projet tellement que quand je dois enregistrer je fais presk un if(is_object($x)) à chaque champ.


    Donc ma question était qu'est ce qui était le mieux : objet vide ou faire des conditions is_object()

    J'espere que j'ai été assez clair ..

    Merci d'avance

  5. #5
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Je ne me suis jamais vraiment trouve dans cette situation, mais peut-etre pourrais-tu creer un auteur anonyme,et l'instancier au debut de ta classe de la meme maniere que tu appelles un auteur existant.
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    oui alors mon objet anonyme serait un objet null sinon il serait plus anonyme =)
    Mon cas est un Exemple. Il y a beaucoup d'autre exemple..
    Sans avoir vraiment l'exemple concret le mien était beaucoup trop long a expliquer .., J'aurais aimé savoir si dans l'absolu c'était mieux de faire des is_object() ou des objets vide .. en terme de performance.

    voila Merci beaucoup pour votre participation

  7. #7
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 301
    Points : 15 622
    Points
    15 622
    Par défaut
    Citation Envoyé par keaton7 Voir le message
    Je ne me suis jamais vraiment trouve dans cette situation, mais peut-etre pourrais-tu creer un auteur anonyme,et l'instancier au debut de ta classe de la meme maniere que tu appelles un auteur existant.
    ou encore mieux, tu pourrais créer deux classes UtilisateurNormal et UtilisateurAnonyme qui héritent de la classe USER et dans l'attribut "auteur" tu pourras mettre une instance d'une de ces 2 classes

  8. #8
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Mon experience sera insuffisante pour te donner une reponse formelle. Cependant, la logique laisse penser qu'instancier un objet est plus lourd que de ne pas le faire et is_object() ne devrai pas s'allouer plus de memoire que ca ... Apres, il est clair que programmer en objet en PHP, c'est deja un sacrifice de performances, alors dans cette voie, il est parfois preferable de preferer une logique stricte plutot qu'un code plus sale qui va plus vite ...

    La rigueur, c'est les elements vides, et les perfs, c'est les conditions partout. Je pense cependant qu'il doit exister une 3eme solution qui serait d'utiliser "l'operateur de controle d'erreur" (@). Ca eviterai la fatal error ...

    Quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @$MonForm->get_o_auteur()->get_name()
    Si tu choisis cette solution, c'est a double tranchant, il te faudra gerer les cas d'erreurs par toi meme.

    Un petit lien :
    http://uk2.php.net/manual/fr/languag...rorcontrol.php
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Merci beaucoup tu m'as bien aidé =)

  10. #10
    Membre averti
    Homme Profil pro
    Lead Dev Web
    Inscrit en
    Avril 2005
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lead Dev Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2005
    Messages : 282
    Points : 390
    Points
    390
    Par défaut
    L'utilisation d'un @ devant est une solution plutôt crade.... :s

    Pourquoi ne pas avoir un système, avec un tableau qui contiendrais le nom de chaque objet créer, tu boucle dessus si il n'est pas vide et tu appel les objets dedans.....

    Php permet de faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $monObjet1 = "o_auteur";
    $monForm->{$monObjet1}->get_name();
    Immagine en ayant différent "o_auteur" dans un tableau sur lequel tu boucle...

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

Discussions similaires

  1. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  2. [POO] Désactiver un objet dont le nom est passé en parametre
    Par JavaEli dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/07/2005, 08h47
  3. Intercepter des objets "vides".
    Par CRUSOE13 dans le forum Access
    Réponses: 9
    Dernier message: 27/06/2005, 00h08
  4. [POO] fonction toUpperCase : Objet attendu
    Par LineLe dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2005, 16h51
  5. [POO] Passer un objet HTML en argument.
    Par defacta dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/12/2004, 10h44

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