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 :

try-catch dans un constructeur [POO]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut try-catch dans un constructeur
    Bonjour,

    je souhaite contrôler le type des arguments passés au constructeur de ma classe . Pour éviter un message d'erreur si l'utilisateur met des paramètres d'un type non accepté, je pensais mettre un try-catch. Mais ça me génère un message d'erreur. Pourquoi ?

    Code php : 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
     
    <?php
    declare(strict_types=1);
    namespace Classes\Olivier;
     
    class Country
    {
      // no setter as the constructor is sufficient
        private $name;  //string
        private $region;  //string 
     
          /* Constructor
          */
        public function __construct(string $name, string $region='') //the 2nd parameter is optional
        {
          try {
            $this->name=$name;
            $this->region=$region;
          }
          catch {
            echo "format incorrect<br/>";
          }
        }

    Parse error: syntax error, unexpected '{', expecting '(' in C:\wamp64\www\ticket2\Classes\Olivier\Country.php on line 20
    Je suis en PHP7.3.5

  2. #2
    Invité
    Invité(e)

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,
    Citation Envoyé par laurentSc Voir le message
    Pour éviter un message d'erreur si l'utilisateur met des paramètres d'un type non accepté
    si le typage des variables te pose un problème, je ne vois pas pourquoi tu ne le retires pas ?
    D'ailleurs, je ne comprends pas trop ton problème et personnellement je ne retirerais pas le typage

    Pour ton apprentissage :
    Un constructeur doit éviter autant que possible de tirer des exceptions.
    S'il le fait, c'est l'instanciation de la classe qui doit être encapsulée au sein d'un bloc try ... catch ... externe.
    Un constructeur ne peut avoir de return sauf un return (void).

    Dis-moi, tu as avancé sur la POO pendant ton sommeil que tu sois confronté aujourd'hui à ce genre de problématique complexe ?
    Ce genre de problème ne se présente que quand tu fais de l'architecture avancée.

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je ne suis dispo pour vous répondre que maintenant.

    Déjà merci à Jérôme car bien que je sache qu'on peut faire des try-catch, je l'avais encore jamais fait...

    Ce que je voudrais, c'est imposer le type des variables (d'où le declare(strict_types=1);), et que si l'utilisateur essaye d'instancier la classe en passant des variables d'un mauvais type, ça affiche un message d'erreur mais ne plante pas le script.

    Je m'attendais à un message d'erreur avec ce code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try{
       $country1=new Country(33); echo "country:". $country1."<br/>";
    }
    catch (Exception $e){
        echo "format incorrect<br/>";
      }

    country.php :
    Code php : 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
     
    <?php
    declare(strict_types=1);
    namespace Classes\Olivier;
     
    class Country
    {
      // no setter as the constructor is sufficient
        private $name;  //string
        private $region;  //string 
     
          /* Constructor
          */
        public function __construct(string $name, string $region='') //the 2nd parameter is optional
        {
            $this->name=$name;
            $this->region=$region;
            echo "type=".gettype($name)."<br/>";
        }
    ...
    mais non, et le type affiché est string et non int. Pourquoi ?

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    t'as juste oublié la directive : declare(strict_types=1); au début du script contenant le try.
    Cette directive doit être OBLIGATOIREMENT présente sur tous les scripts pour que le moteur l'applique.

    Si tu l'ajoutes, voici ce que tu obtiens :
    Fatal error: Uncaught TypeError: Argument 1 passed to Classes\Olivier\Country::__construct() must be of the type string, int given, called in
    Et là, ça fonctionne comme attendu

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Merci pour l'explication sauf que l'attendu, c'est pas une fatal error de PHP mais que le script détecte le mauvais type et affiche un message d'erreur et que le script ne plante pas...

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    le moteur détecte bien le mauvais type et il plante ce qui est tout à fait normal. C'est ce qui assure la cohérence d'une part et un niveau de sécurité accru d'autre-part.
    Cette rigidité oblige le développeur à une très grosse rigueur et c'est à lui de s'assurer que ce qu'il présente en entrée de fonction correspond parfaitement à ce qui est attendu.
    Le moteur ne fera pas ce travail à ta place : si les types ne correspondent pas : le jeu est terminé.
    Donc en amont, soit tu t'assures que les types de données collent parfaitement, soit tu les castes explicitement mais dans tous les cas, s'il y a un problème à posteriori, ça ne sera uniquement que de la faute du développeur.

    Bref, codage autrement plus propre et sécurisé.

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

Discussions similaires

  1. Utilisation de try catch dans une procédure de backup de database
    Par megtrinity dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 05/11/2009, 14h53
  2. Try, catch dans une fonction
    Par mactwist69 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 10/07/2008, 16h39
  3. Try/ catch dans une fonction ActionPerformed
    Par thomas2929 dans le forum Langage
    Réponses: 13
    Dernier message: 09/06/2008, 12h06
  4. Problème try-catch dans mon code
    Par little pepito dans le forum Langage
    Réponses: 7
    Dernier message: 11/06/2007, 12h22
  5. Try catch dans une dll - possible ?
    Par Pendary dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/03/2007, 16h48

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