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 :

Les Class et les isset ou is_null [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut Les Class et les isset ou is_null
    Bonjour.

    J'ai vu qu'on pouvait placer des isset dans les classes ou les instances d'objet.

    A quoi ça peut vraiment servir si on va quand même avoir une erreur ?

    Si je fais une erreur à l'extérieur de de class comme dans l'instance d'un objet, ça va m'afficher une erreur quand même.

    Ici, je simule une erreur et ma vérification ne va pas marcher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(is_null($instance->add()))
    echo "Erreur: ";
     
    $instance->add();
     
    echo $instance->show();
    Je parle des isset, is_null et des vérification dans une méthode ou lors de l'instanciation.

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    Bonsoir,

    je ne comprend pas le test

    isset() sur une méthode ? quel est le but ?

    c'est pour tester uniquement si une variable existe(isset) ou est nulle(is_null)
    en objet, une variable est une propriété

    ecrire ca ok :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (is_null($instance->titre)) echo "Erreur: la propriété titre de l'objet est egale a null";
    mais ce n'est pas spécifique objet

    par contre if (is_null( $instance->getTitre() )) ce n'est pas bon : getTitre() est une méthode

  3. #3
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    J'étais en train de tester comme ceci :

    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
    $n1 = "a";
    $n2 = 4;
     
    $strings = array($n1,$n2);
    foreach ($strings as $test) 
    {
      if (ctype_digit($test)) 
      {
        $n1=null;
        $n2=null;      
      } 
      else 
      {
        $n1=$n1;
        $n2=$n2;
      }
    }
     
    $instance->add($n1,$n2);
    echo $instance->show();
    Pour le moment, ça laisse passé celui qui est un digit.
    Mais, faut que ça soit les deux ou bien indiquer une erreur.
    Ça peut devenir lourd ce genre de test à la longue.

    Je viens d'essayer votre commande, ça m'indique qu'il ne peut pas
    tester sur une propriété private. Mais, ça m'indiquerait aussi
    qu'il manque soit un argument si je l'omet, ou si je mets un string,
    un autre erreur.

    C'est de mettre deux variables externe et de les tester.. c'est ce que
    je vois comme solution.

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    je comprend rien

    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 objet {
     private $a,$b;
     
     function add($a=null,$b=null){
       if (($a==null) || is_null($b)) {
           throw new Exception('Parametre invalide.');
       }
       $this->a =$a;
       $this->b =$b;
     }
     
     public function setA($a){
        if ($a==null) throw new Exception('Parametre invalide.');
        $this->a = $a;
     }
     
     public function setB($b){
        if ($b==null) throw new Exception('Parametre invalide.');
        $this->b = $b;
     }
     
     public function ajouter($a,$b){
        $this->setA($a);
        $this->setB($b);
     }
     
    }
    c'est ca le but ??

  5. #5
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Si l'idée est comme tester si c'est un type digit à $a et $b quand je mets à J'ai fait ceci et ça indique un non digit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $a = 1;
    $b = 20;
     
    if (ctype_digit($a) && ctype_digit($b)){
        $instance->add($a,$b);
    }
    else{
        $instance->add(1,1); //indiquer 0 et 0 par défaut. Aimerais mieux un message d'erreur personalisé. 
    }
    Je vais essayer votre bout de code.

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    j'ai utilisé des exception dans les classes , on les utilise comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
         $instance->add(null,1);
         $instance->echo();
    } catch (Exception $e) {
         echo 'Exception reçue : '.$e->getMessage();
         // throw $e; si je désire stopper php  sur cette erreur
    }
    a toi de mettre les tests que tu desires a l'intérieur de la méthode add !

  7. #7
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Dans le fond, si dans un formulaire, je dois faire des vérifications
    comme quoi add() contient bien deux chiffres 2,2 par exemple,
    c'est ok ça passe, sinon envoyer un message d'erreur. Mais pas
    celui de PHP. J'ai penser tester en dehors de la classe.

    Si j'essaie d'appliquer l'avant dernier bout de code proposé, ça me donnerait ceci à mon code si j'ai bien compris:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <?php
     
    class Pizza{
     
        private $prenom;
        public $command=0;
        public $prix=0;
     
        public function __construct($pnom){
            $this->prenom = $pnom;
        }
     
        public function add($cmand,$cout){
     
            if (($cmand==null) || is_null($cout)) {
                   throw new Exception('Parametre invalide.');
               }
               $this->command =$cmand;
               $this->prix =$cout;
     
            $this->command += $cmand;
            $this->prix += $cout;
        }
     
        public function setCommand($cmand){
            if ($cmand==null) throw new Exception('Parametre invalide.');
            $this->command = $cmand;
         }
     
         public function setPrix($cout){
            if ($cout==null) throw new Exception('Parametre invalide.');
            $this->prix = $cout;
         }
     
         public function ajouter($cmand,$cout){
        $this->setCommand($cmand);
        $this->setPrix($cout);
     }
     
     
        public function show(){
            $aff[] = '';
            $aff = array($this->command=>$this->prix);
     
            foreach ($aff as $key => $value) {
                $more = ($this->command>1) ? 's' : '';
                return '<b>'.$key.'</b> pizza'.$more.' vendue'.$more.' pour un total de <b>'.number_format($value,2, '.', ' ').'$</b>.';
            }
        }
     
    }
     
    $instance = new Pizza("Garnis");
     
    $instance->add(3,3);
    echo $instance->show();
     
     
    ?>
    J'ai surement pas bien fait les choses.

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    Pas touché a ta méthode add() , j'ai préféré refaire la même sous ajouter()
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    class Pizza{
     
        private $prenom;
        public $command=0;
        public $prix=0;
     
        private $message; // message d'erreur
     
        public function __construct($pnom){
            $this->prenom = $pnom;
        }
     
        public function add($cmand,$cout){
     
            if (($cmand==null) || is_null($cout)) {
                throw new Exception( $this->message='Parametre invalide.' );
            }
     
            $this->command =$cmand;
            $this->prix =$cout;
     //comprend rien ???
            $this->command += $cmand;
            $this->prix += $cout;
        }
     
        public function setCommand($cmand){
            if ($cmand<1) throw new Exception($this->message='Commande invalide.');
            $this->command = $cmand;
        }
     
        public function setPrix($cout){
            if ($cout<1) throw new Exception($this->message='Prix invalide.');
            $this->prix = $cout;
        }
     
        public function ajouter($cmand,$cout){
            $this->setCommand($this->command+$cmand);
            $this->setPrix($this->prix+$cout);
            return $this; // ce retourne lui meme pour chainer
        }
     
        public function show(){
                $more = ($this->command>1) ? 's' : '';
                return '<b>'.$this->command.'</b> pizza'.$more.$this->prenom.' vendue'.$more.' pour un total de <b>'.number_format($this->prix,2, '.', ' ').'$</b>.';
        }
     
        public function getMessage() {
            return $this->message;
        }
     
    }
     
    /* --------------- tests ------------------ */
     
    $instance = new Pizza("Garnis");
    echo $instance->ajouter(3,6)->show().'<br />';
     
    try
    {
        $instance = new Pizza("Poillée");
        $instance->ajouter(3,0);
        echo $instance->show().'<br>';
    } catch (Exception $e) {
         echo '<h3>veuillez resaisir : '.$instance->getMessage().'</h3>';
         // throw $e; si je désire stopper php  sur cette erreur
    }
     
    try
    {
        $instance = new Pizza("Frisée");
        echo $instance->ajouter(null,6)->show();
    } catch (Exception $e) {
         echo '<h3>veuillez resaisir  '.$e->getMessage().'</h3>';
         // throw $e; si je désire stopper php  sur cette erreur
    }

  9. #9
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Sans vraiment savoir si c'est une bonne pratique, j'ai fait comme ceci qui fonctionne bien :

    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
    <?php
    class MaClasse {
     
        private $id;
        private $attribut;
     
        public function __construct($id=null, $attribut=null)
        {
            if( !empty($id) || !empty($attribut) ){
                $this->id = $id;
                $this->attribut = $attribut;
                $this->message = "Le ID est $this->id et l'ATTRIBUT est $this->attribut";
            }
            else{
                $this->message = "ERROR";
            }
        }
     
        public function affiche(){
            return $this->message;
        }
    }
     
    $objet = new MaClasse();
    echo $objet->affiche();
     
    ?>
    Ça va afficher erreur dans ce cas-ci mais si je mets deux chiffres, ça va afficher la phrase.

    Bon, si ce n'est pas une bonne pratique, j'aimerais en être informé et expliqué SVP. Merci.

    Ça vérifie pas le type mais si y a un argument dans l'instanciation
    (si je peux dire ainsi).

  10. #10
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Une autre façon que je peux faire, mais ça peut surement aussi faire l'affaire:

    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
    31
    32
    33
    34
    35
    36
    37
     
    <?php
    class Pizza {
     
        private $qt;
        private $produit;
        private $prix;
     
        public function __construct(){
        }
     
        public function commande($qt=null,$produit=null,$prix=null)
        {
            if( !empty($qt) && !empty($produit) && !empty($prix) ){
     
                $this->qt = $qt;
                $this->produit = $produit;
                $this->prix = $prix;
     
                setlocale(LC_ALL, 'ca_CA');
                $prixf = number_format($this->prix, 2, '.', ' ');
     
                $this->message = "Commande: $this->qt $this->produit au prix de $prixf<br>";
            }
            else{
                $this->message = "ERROR";
            }
     
            return $this->message;
        }
    }
     
    $objet = new Pizza();
    echo $objet->commande(1,"pizza",10);
    echo $objet->commande(4,"pizza",36);
     
    ?>
    Mais dans les deux cas, je ne peux pas faire de manipulation autre que faire de l'affichage.

    Sii ça p eut être optimiser, vous me dirai.

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    remarque son ton dernier essai :

    pas encore assez le reflexe objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale(LC_ALL, 'ca_CA');$prixf = number_format($this->prix, 2, '.', ' ');
    ca je le remplace automatiquement par une méthode-> getFormatPrix()

    Tu n'as pas l'air d'aimer mes Exceptions ? c'est pourtant une technique qui fait partie de la poo, je te dirai même qu'il est obligatoire de l'utiliser (en poo) !

  12. #12
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Tu veux dire faire une public function getFormatPrix() dans la même class?

    et ensuite appeler cette fonction par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getFormatPrix($this->prix)
    pour faire apparaitre le prix formaté?

    C'est ce que j'imagine là.

    C'est un truc sur les getter/setter?

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    oui tu peux le voir comme un getter mais comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getFormatPrix();
    mais surtout pas de parametre $this->xxxx sinon tu casses completement le coté objet

    si prix est privé oui, tu dois avoir un getter ->getPrix() { return $this->prix; }

    ps :
    je t'ai fait des setter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public function setCommand($cmand) {}
    public function setprix($cprix) {}
    et justement les setters servent a faire des vérifications !

    ps: en francais, on parle d' accesseurs et mutateurs , les getters et setters c'est pour nos voisins outre manche.

  14. #14
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je ne vois pas pour .

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?php
    class Pizza {
     
        private $qt;
        private $produit;
        private $prix;
     
        public function __construct(){
        }
     
        public function setQt($qt) {}
        public function setProduit($produit) {}
        public function setPrix($prix) {}
     
        public function commande($qt=null,$produit=null,$prix=null)
        {
            if( !empty($qt) && !empty($produit) && !empty($prix) ){
     
                $this->qt = $qt;
                $this->produit = $produit;
                $this->prix = $prix;
     
                setlocale(LC_ALL, 'ca_CA');
                $prixf = number_format($this->prix, 2, '.', ' ');
     
                $this->message = "Commande: $this->qt $this->produit au prix de $prixf<br>";
            }
            else{
                $this->message = "ERROR";
            }
     
            return $this->message;
        }
    }
     
    $objet = new Pizza();
    echo $objet->commande(1,"pizza",10);
    echo $objet->commande(4,"pizza",36);
     
    ?>

  15. #15
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Il me manquait quelques notions que je me suis empressé de me renseigner. C'est résolu pour ce topic. Merci pour vos interventions.

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

Discussions similaires

  1. les services métiers / les classes métiers / les classes services
    Par titititiangel dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 27/05/2013, 12h01
  2. les methodes et les associations entre les classes
    Par zin_rbt dans le forum Diagrammes de Classes
    Réponses: 1
    Dernier message: 24/05/2010, 15h41
  3. les classes et les templates dans les plugins
    Par asoka13 dans le forum C++
    Réponses: 22
    Dernier message: 24/01/2008, 18h11
  4. Réponses: 31
    Dernier message: 30/03/2006, 17h57

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