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 , héritage et tableaux


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Points : 54
    Points
    54
    Par défaut POO , héritage et tableaux
    Bonjour,

    J'ai un souci de lecture de tableau qui devrait être hérité de ma classe mère. Mais quand je vais un dump, le tableau est vide alors qu'il est initialisé dans la classe elle-même.
    Pouvez-vous m'aider à débugger ?


    Je ne met pas tout le contenu des classes, juste les parties concernées.

    important: si je remplace le mot clef protected par public, cela ne modifie en rien le comportement du code.


    Merci d'avance !

    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
    41
    42
    43
    44
    45
    46
    47
     
     
    class autoFormConverrt {
     
     
        protected $equivalent = [];
        protected $libelle = [];
        protected $exclude = [];
        protected $required = [];
        protected $optional = [];
     
        public function __construct() {
     
            $this->exclude['kot_stay']['facturation_type'] = true;
            $this->exclude['kot_stay']['facturation_number'] = true;
            $this->optional['kot_stay']['facturation_type'] = true;
            $this->optional['kot_stay']['facturation_number'] = true;
    }
    }
     
     
    class autoform extends autoFormConverrt {
     
        const SCHEMA = 'develop';
     
        static $_compteur = 0;
        public function __construct($action = null, $id = null, $method = null, $return = null) {
            self::$_compteur++;
            parent::__construct();          // building array for field's name correspondences 
     
    }
    public function makeInput() {
            if (count($this->required[$this->_table]) > 0) {
                $required = '';
            } else {
                $required = ' required';
            }
            var_dump($this->libelle);    // <=========== là ça m'affiche un tableau vide alors qu'il reçoit des entrées dans la classe parente
            br();
     
            if (isset($this->optional[$this->_table][$name])) {         // <========= du coup je ne passe pas ici alors que cela devrait
                $required = '';
            }
     
     
    }
    }

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    affichez le contenu de "$this->libelle" dans les différents constructeurs et vous verrez peut-être mieux ce qu'il se passe.

    si vous avez besoin de plus d'informations, montre nous votre code de test avec l'instanciation et l'utilisation des méthodes. dans le code de test de votre 1er message, il y a juste les définitions des classes.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Points : 54
    Points
    54
    Par défaut
    Je suis un ballot, j'ai oublié le code test. Désolé.

    Il manque aussi la classe de travail, les classes "auto...." servant de bibliothèques.

    Je remet tout ici pour éviter de passer d'un post à l'autre pour trouver le code


    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
    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
    76
    77
    78
    79
    80
    81
     
     
    class autoFormConverrt {
     
     
        protected $equivalent = [];
        protected $libelle = [];
        protected $exclude = [];
        protected $required = [];
        protected $optional = [];
     
        public function __construct() {
     
            $this->exclude['kot_stay']['facturation_type'] = true;
            $this->exclude['kot_stay']['facturation_number'] = true;
            $this->optional['kot_stay']['facturation_type'] = true;
            $this->optional['kot_stay']['facturation_number'] = true;
    }
    }
     
     
    class autoform extends autoFormConverrt {
     
        const SCHEMA = 'develop';
     
        static $_compteur = 0;
        public function __construct($action = null, $id = null, $method = null, $return = null) {
            self::$_compteur++;
            parent::__construct();          // building array for field's name correspondences 
     
    }
    public function makeInput() {
            if (count($this->required[$this->_table]) > 0) {
                $required = '';
            } else {
                $required = ' required';
            }
            var_dump($this->libelle);    // <=========== là ça m'affiche un tableau vide alors qu'il reçoit des entrées dans la classe parente
            br();
     
            if (isset($this->optional[$this->_table][$name])) {         // <========= du coup je ne passe pas ici alors que cela devrait
                $required = '';
            }
     
     
    }
    }
     
     
    class common extends autoform {
     
        public function __construct() {
            parent::__construct();
            $this->_loadingTime = time();
            self::$_compteur++;
            $this->_con = $this->connect();       // utilise les paramêtres de connection de l'application        
            $this->_con->query("SET NAMES utf8"); // on communique avec la bdd en utf-8
        }
     
     
    }
     
    class stay extends common { 
        const TABLE_NAME = 'stay';  // table liée à la classe
        const FIELD_ID = 'id_stay';       // clé primaire 
     
     
        public function __construct() {
            self::$_compteur++;
            $this->_con = @connect();       // utilise les paramêtres de connection de l'application
            $this->_con->query("SET NAMES utf8"); // on communique avec la bdd en utf-8            
        }
     
     
    }
     
     
    // corps du programme 
     
    $work = new stay();   // instanciation de la classe de travail
    $work->makeInput();  // appel à la fonction qui se trouve dans la classe parente, celle-ci devant utiliser les données du tableau libelle pour faire les affichages.

    Voilà, j'espère que je n'ai rien oublié.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Points : 54
    Points
    54
    Par défaut
    Bonsoir,

    Je suis arrivé à débugger mon code, mais manifestement il y a des fondamentaux que je ne possède pas bien.

    Pour m'en sortir, dans le constructeur de chaque classe fille j'ai ajouté
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
            parent::__construct();
            $this->_libelle = parent::getText();        // initializing the text array
            $this->_exclude = parent::getExclude();

    Ceci est ennuyeux parce que toutes mes classes vont hériter de common.class.php et je voudrais éviter de devoir remettre à chaque fois ces 3 lignes de code.
    Si je rend les tableaux de autoFormConvert.class.php public au lieu de protected, cela résoudra-t-il mon problème ?


    Pour vous situer le contexte, je n'ai pas envie d'apprendre un framework "juste" pour mes CRUD.
    Du coup j'ai écris 3 classes

    - common.class.php qui fait les connexions BDD et assigne les valeurs par défaut
    - autoform.class.php qui va lire la structure de la table demandée, les relations et générer un formulaire avec tous les champs rencontrés
    - autoFormConvert.class.php qui ne contient que des tableaux reprenenant :
    -- les libellés pour les saisies
    -- les champs requis
    -- les champs optionnels
    -- les champs cachés

    Comme mes nouvelles classes héritent de common, j'essaye de ne plus avoir plus d'une ligne à écrire pour avoir un formulaire de saisie (brut) et une autre pour faire la sauvegarde.

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    Citation Envoyé par Louprouge Voir le message
    Pour m'en sortir, dans le constructeur de chaque classe fille j'ai ajouté
    dans le constructeur fille de quelle classe ?
    si le code se répète, vous pouvez le mettre dans le constructeur de la classe mère.

    les attributs "protected" sont accessibles dans toutes les classes héritées donc je ne vois pas où cela peut être un problème (le code de votre message de 17 h 59 ne peut pas être lancé)
    https://www.php.net/manual/fr/langua...visibility.php

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Je pense que mon code ne fonctionne pas parce que j'ai laissé les appels à la connexion à la base de donnée.
    Je ne pensais pas que vous l'exécuteriez.

    Il semblerait que "quelque part" quelque chose fait que le tableau n'est plus connu.

    Je viens de faire quelques essais et , si je déclare mes tableaux en public dans autoFormConverrt qui est la classe de départ, tout devient visible, même dans toutes les classes dérivées jusqu'à 4 niveaux.
    Par contre, si je remet ces tableaux en protected , dés le premier héritage la visibilité des tableaux est perdue.

    Je viens donc de refaire un test en simplifiant à l'extrême:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    include_once './tools.php';
     
    $x = new autoFormConverrt();
     
    var_dump($x->$optional);

    tools contient la conction autoloader:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    function chargerClasse($classe) {
        require 'class/' . $classe . '.class.php'; 
    }
     
    spl_autoload_register('chargerClasse');
    ?>


    Et enfin autoFormConvert.class.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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    class autoFormConverrt {
     
        protected $equivalent = [];
        protected $libelle = [];
        protected $exclude = [];
        protected $required = [];
        protected $optional = [];
     
        public function __construct() {
            // we're just defining correspondances between field name 
            // the strucure is : 
            // array['parent's table name']["daughter's field name" => "parent's field name"]
            $this->equivalent['orion_reproducteur'][] = ['id_mere' => 'id_reproducteur'];
     
     
            // this array is used to display a nice text in front of each input field
            // use it as this: 
            // array['table name']["field name to display" => "text to show"]
            $this->libelle['orion_reproducteur'][] = ['id_mere' => 'Mère'];
            $this->libelle['orion_portee'][] = ['date_naissance' => 'Date de naissance'];
     
     
            // this array is used to exclude a field from a form
            $this->exclude['kot_cats']['id_proprio'] = true;
     
     
            // if set , only the named fields here will be required
            $this->required['kot_cats']['nom'] = true;
            $this->required['kot_cats']['race'] = true;
     
            // if set, named fields won't be required
            $this->optional['prospects']['tel'] = true;
        }
    }


    Sur le serveur nous avons l'arborescence :
    root : tools.php
    test.php (programme appelé)
    root/class/
    autoFormConverrt.php


    lors de l'exécution sur le serveur j'ai l'affichage web suivant:
    NULL

    aucune erreur dans le log.







    Voici le code nettoyé des appels non présents dans le code d'hier soir, mais comme le problème se présente déjà dans la version simplifiée, est-ce encore utile ?
    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
    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
     
     
    class autoFormConverrt {
     
        protected $equivalent = [];
        protected $libelle = [];
        protected $exclude = [];
        protected $required = [];
        protected $optional = [];
     
        public function __construct() {
     
            $this->exclude['kot_stay']['facturation_type'] = true;
            $this->exclude['kot_stay']['facturation_number'] = true;
            $this->optional['kot_stay']['facturation_type'] = true;
            $this->optional['kot_stay']['facturation_number'] = true;
        }
     
    }
     
    class autoform extends autoFormConverrt {
     
        const SCHEMA = 'develop';
     
        static $_compteur = 0;
     
        public function __construct($action = null, $id = null, $method = null, $return = null) {
            self::$_compteur++;
            parent::__construct();          // building array for field's name correspondences 
        }
     
        public function makeInput() {
            if (count($this->required[$this->_table]) > 0) {
                $required = '';
            } else {
                $required = ' required';
            }
            var_dump($this->libelle);    // <=========== là ça m'affiche un tableau vide alors qu'il reçoit des entrées dans la classe parente
            br();
     
            if (isset($this->optional[$this->_table][$name])) {         // <========= du coup je ne passe pas ici alors que cela devrait
                $required = '';
            }
        }
     
    }
     
    class common extends autoform {
     
        public function __construct() {
            parent::__construct();
            $this->_loadingTime = time();
            self::$_compteur++;
        }
     
    }
     
    class stay extends common {
     
        const TABLE_NAME = 'stay';  // table liée à la classe
        const FIELD_ID = 'id_stay';       // clé primaire 
     
        public function __construct() {
            self::$_compteur++;
        }
     
    }
     
    // corps du programme 
     
    $work = new stay();   // instanciation de la classe de travail
    $work->makeInput();  // appel à la fonction qui se trouve dans la classe parente, celle-ci devant utiliser les données du tableau libelle pour faire les affichages.

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    Citation Envoyé par Louprouge Voir le message
    Je viens donc de refaire un test en simplifiant à l'extrême:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    include_once './tools.php';
     
    $x = new autoFormConverrt();
     
    var_dump($x->$optional);
    là c'est encore un autre souci, vous devriez avoir un message d'erreur indiquant que la variable $optional n'existe pas.
    revoyez la configuration de php parce que l'affichage des erreurs doit être au maximum pendant le développement.

  8. #8
    Membre confirmé Avatar de steel-finger
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 184
    Points : 549
    Points
    549
    Par défaut
    Dans ton code j'ai peut-être raté un truc, mais a aucun moment tu initialises une valeur dans l'attribut "$libelle" ?

Discussions similaires

  1. [POO] héritage en php
    Par zana74 dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2006, 10h50
  2. [POO] Héritage vs classe dans une classe
    Par robichou dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2006, 00h51
  3. [POO] Poo : héritage & constructeur
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 15h29
  4. [POO]héritage du constructeur de la classe parente
    Par new_wave dans le forum Langage
    Réponses: 7
    Dernier message: 10/03/2006, 15h25
  5. [POO-Héritage] Appel du constructeur en PHP4.3.2
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2005, 16h37

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