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
    Membre expert

    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 274
    Points : 3 896
    Points
    3 896
    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

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

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

    Informations forums :
    Inscription : septembre 2011
    Messages : 186
    Points : 211
    Points
    211
    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
    Membre expert

    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 274
    Points : 3 896
    Points
    3 896
    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

  4. #4
    Membre expérimenté Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    mai 2004
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mai 2004
    Messages : 1 133
    Points : 1 658
    Points
    1 658
    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)
    Mes scripts Open Source : https://github.com/cavo789

  5. #5
    Membre expert

    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    8 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 274
    Points : 3 896
    Points
    3 896
    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

  6. #6
    Membre expérimenté Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    mai 2004
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mai 2004
    Messages : 1 133
    Points : 1 658
    Points
    1 658
    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)
    Mes scripts Open Source : https://github.com/cavo789

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

Discussions similaires

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

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