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 :

cette propriété n'est pas alimentée [POO]


Sujet :

Langage PHP

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut cette propriété n'est pas alimentée
    Bonjour,

    j'ai une classe dont la responsabilité est de vérifier la validité des données qu'on lui passe. Une de ses propriétés est la chaîne (string) $errors. Dedans, on y inscrit toutes les erreurs (avec un séparateur (##) ). Mon souci est qu'à la fin, bien que des erreurs aient été détectées, donc écrites dans la propriété, celle-ci est vide. Donc l'écriture ne s'est pas faite.

    Voici mon code, et merci de me dire comment le corriger :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class Record
    {
        private $errors = "";  // la string des erreurs
        public $infos = "";
        public $warnings = "";
     
        private $data = [];  // les données à analyser
     
     
        public function __construct( array $data, $str_errors, $str_infos)
        {
            $this->data = $data;
            $this->errors = $str_errors;
            $this->infos = $str_infos;
        }
     
        public function analyze(&$str_errors , &$str_warnings)
        {
     
            $ref_Application = new Application( $this->data['sesaid'], $this->data['applicationname'],
                $this->data['platform'],
                $this->data['platformowner'],
                $this->data['publisher']);
     
     
            if (!$ref_Application->isValid())
            {
                $new_error = $ref_Application->errors();
                foreach($new_error as $one_error)
                {
                    $str_errors.= $one_error."##";
                }
            }
        etc
        }
     
        public function hasErrors(): bool
        {
            return ! empty($this->errors);
        }

    Je vous ai mis un exemple d'analyse des données (les données de la classe Application) ; si des erreurs ont été détectées, la string $str_errors est mise à jour. Cette variable étant passée par adresse à la méthode, son écriture restera visible quand on sort de la méthode. Le souci est que par contre, la propriété $errors n'est pas affectée. Quand plus tard, j'appelle la méthode hasErrors, celle-ci déclare qu'il n'y a pas d'erreur.
    Comment faire pour que les écritures dans $str_errors soient répercutées dans la propriété $errors ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Bonjour,

    Je ne comprend vraiment pas l'utilité de la variable $str_errors...

    Bref, pour moi il est normal que la propriété $errors ne change pas puisque rien dans le code ne la fait changer, pourquoi ne pas faire plus simple 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
     
    public function analyze(&$str_errors , &$str_warnings)
        {
     
            $ref_Application = new Application( $this->data['sesaid'], $this->data['applicationname'],
                $this->data['platform'],
                $this->data['platformowner'],
                $this->data['publisher']);
     
     
            if (!$ref_Application->isValid())
            {
                $this->errors.= implode('##', $ref_Application->errors())."##";
            }
        etc
        }
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    La raison est simple : j'adore me faire des nœuds au cerveau

    Merci de m'avoir proposé une solution simple...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Bonjour

    Sur base de ton premier code, je ne comprends pas à quoi sert la variable str_warnings qui n'est pas utilisée.

    Ce qui me fait tiquer, c'est pourquoi tu passes des variables par référence... C'est une très mauvaise pratique qui devrait être abandonnée sans délai. Il faut considérer un paramètre comme intouchable. Si tu veux que ta fonction modifie le paramètre, il faut que la fonction retourne une valeur (qui peut être un tableau, un objet, ...).

    Comme cela, je dirais que str_errors devrait être une propriété de la classe et tu y accéderais avec $this-> mais, personnellement, je suis adapte des exceptions.

    Si tu as une erreur, aujourd'hui, tu fais quoi ? Tu la gères ou tu l'ignores... Vu que ton erreur est silencieuse, il y a un risque important que tu l'ignores alors que, s'il y a une erreur, il faut la gérer. Du coup, perso, je fais des throw new \Exception("Une erreur est survenue") qui me force, toujours!, à gérer l'erreur.

    Un concept de bonne programmation est de ne pas avoir de paramètres passés par référence, un autre concept c'est de ne pas avoir d'erreurs silencieuses.

    Bonne soirée.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    oui, $str_warnings, c'est historique ; elle n'est plus utilisée mais je l'avais laissée car ça marchait comme ça et
    que quand ça marche, je ne touche à rien...(en essayant de nettoyer, on peut tout casser et une opération de quelques minutes peut coûter plusieurs jours )

    Je comprend que le passage par référence n'est pas une bonne pratique ; je l'avais fait car ça simplifiait la
    programmation, mais j'ai adopté la solution de Soundboy39 avec laquelle j'ai juste une propriété $errors(et donc
    plus aucun passage par référence).
    Je sais que tu es adepte des exceptions (tu me l'avais déjà dit). J'avais essayé d'en faire aussi. Ca ne marchait pas
    et j'ai pas insisté (évidemment, je sais plus pourquoi ça marchait pas).

    Ici, l'erreur est gérée : s'il y en a (une ou plusieurs), l'utilisateur est informé (et a la liste des erreurs) et
    seulement s'il n'y en a pas, je fais une écriture en bdd.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    elle n'est plus utilisée mais je l'avais laissée car ça marchait comme ça et que quand ça marche, je ne touche à rien...(en essayant de nettoyer, on peut tout casser et une opération de quelques minutes peut coûter plusieurs jours )
    [Mode taquin]Rooooh la mauvaise excuse [/Mode taquin]
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/01/2014, 08h48
  2. Réponses: 2
    Dernier message: 18/04/2012, 09h12
  3. Réponses: 7
    Dernier message: 01/06/2011, 12h41
  4. Réponses: 5
    Dernier message: 24/05/2011, 08h54
  5. Réponses: 3
    Dernier message: 27/03/2008, 16h17

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