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] Classe abstraite PHP5 et variables membres [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut [POO] Classe abstraite PHP5 et variables membres
    Bonjour,

    Petite question au sujet des classes abtraites PHP5, il s'agit d'une question sur le fondement même du concept de "classe abstraite".

    Les variables membres privées d'une classe abstraite sont héritées par toutes ses sous-classes, il s'agit vraissemblablement d'une erreur de conception objet (un contournement...) ?


    Classe abstraite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    abstract class MyClass
    {
    <div style="margin-left:40px">private $_a = NULL;</div>
    # ( ... )
    }
    Classe membre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class MySubClass extends MyClass
    {
    <div style="margin-left:40px">public function __construct()
    {
    <div style="margin-left:40px">var_dump($this);</div>}</div>}
    Résultat
    Citation Envoyé par PHP
    object(MySubClass)#1 (1) { ["_a:private"]=> NULL }
    Cela dit, cela peut-être pratique de pouvoir imposer des variables privées à des sous-classes, en amont des méthodes abstraites... Qu'en pensez-vous ?

    Merci

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 327
    Points : 15 670
    Points
    15 670
    Par défaut
    d'un autre coté une classe abstraite ne peux pas être instanciée donc ce n'est pas une question de PHP mais de POO générale, non ?

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Je pense que var_dump est un peu particulier

    As-tu essayé un simple echo de ta variable privée dans ta classe fille?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mathieu
    d'un autre coté une classe abstraite ne peux pas être instanciée donc ce n'est pas une question de PHP mais de POO générale, non ?
    Effectivement il s'agit d'un problème de POO en général, mais que je suppose particulier à PHP.

    Le problème c'est que PHP n'emet aucune erreur ou avertissement lorsque la logique d'une classe abstraite ou une interface est "contournée".

    La classe abstraite ne pourra pas être directement instanciée, c'est un fait.

    Parcontre il est possible d'imposer un constructeur (public ou protégé) à toutes les classes sous-jacentes et ainsi contourner cette vérification et par la même "instancier" indirectement la classe abstraite (instance environnente au contexte de la sous-classe qui l'a créée) !

    C'est testé, et cela fonctionne, sans autres. Je ne crois pas que ce soit logique du point de vu des fondements de la POO. Et c'est ça la question :

    Peut-on se servir d'une classe abstraite pour :

    Utilisations qui me paraissent logique ou acceptable
    • Constantes ou variables statiques.
    • Méthodes statiques (publiques, protégées ou même privées).
    • Méthodes abstraites sans bloque d'instruction.
    • Méthodes protégées (pour héritage).


    Utilisations non-conventionnelles, mais qui fonctionnent
    • Déclaration de variables privées (qui sont curieusement héritées par les classes sous-jacentes !)*
    • Déclaration d'un constructeur publique, protégé ou privé.
    • Déclaration de méthodes publiques (n'a pas de sens étant donné que le contexte d'appel est toujours privé ou protégé).
    • Déclaration d'une méthode magique abstraite (Obligation de déclarer un constructeur par exemple, c'est pas logique, mais ça peut servir)


    S'agit-il des limites actuelles de l'orienté objet PHP 5 ? je sais pas.

    Font-ils pleinement confiance au programmeur, qui par sa formation, évitera de mettre à mal le concepte de classe abstraite ou interface ? probablement...

    *
    Il semblerait qu'une variable privée définie dans une classe abstraite soit héritée par une sous-classe, sans pour autant être définie dans cette dernière.

    Ainsi, lorsque on réalise sur l'objet d'une sous-classe, un var_dump($this) ou var_export($this), la variable est présente, avec la valeur initialisée dans la classe abstraite.

    Si l'on veut afficher directement la variable héritée (var_dump($this->_a) ou echo $this->_a), celle-ci est affichée en publique avec la valeur NULL. (Ce qui est normal).

    Parcontre, si l'on redéclare explicitement la variable héritée de la classe abstraite dans la sous-classe en privée, on se retrouve (en mémoire) avec deux variables portant le même nom, la même visibilité, et deux valeurs différentes ! quelle salade...


    Je vais clarifier tout ça dans un article ! Je pense qu'il serait intéressant d'obtenir des eclairessiments là-dessus.
    Dernière modification par Invité ; 07/06/2006 à 19h52.

Discussions similaires

  1. [POO] Classes abstraites
    Par GLDavid dans le forum Langage
    Réponses: 12
    Dernier message: 02/03/2006, 11h18
  2. [POO] Débutant en POO, class mysql php5
    Par ouafouaf dans le forum Langage
    Réponses: 9
    Dernier message: 06/02/2006, 09h21
  3. [POO] class abstraite et methode magic
    Par jeff_! dans le forum Langage
    Réponses: 14
    Dernier message: 24/01/2006, 23h19
  4. [POO] Classe en PHP5
    Par neptune dans le forum Langage
    Réponses: 5
    Dernier message: 01/09/2005, 17h55
  5. Réponses: 3
    Dernier message: 19/05/2005, 10h46

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