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 interne à une classe, est ce possible ?


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut [POO] Classe interne à une classe, est ce possible ?
    Bonjour,

    Je suis programmeur PHP4, et je commence à envisager l'adaptation des mes pages en PHP5. Je voudrais savoir si il est possible de déclarer une classe à l'intérieur d'une autre en PHP5 (comme dans d'autre langage objet). En résumé est ce je peux ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Toto{
      private class Tata{
     
      }
    }
    Ca me serait bien utile notament pour proteger l'acces au données et méthodes de Tata, car on ne doit acceder à celle ci que par les méthodes de Toto.

    Merci !

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Je ne ferais pas de cette manière. Une classe est quelque chose d'abstrait toutes existent les unes à côté des autres.
    Je pense que PHP a certainement intégré le mot-clef protected avec la version 5, non ? C'est, il me semble, ce que tu cherches à faire.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    salut
    php5 ne permet pas de faire des class Privés, des methodes oui mais pas des class.
    je crois qu'il y a un pattern "proxy" qui pourrait se rapprocher de ce que tu veut faire

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    Merci pour vos réponses

    Pour le moment en PHP4 j'ai quelque chose du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Toto{
      var $tata; //tableau contenant des instances de tata
    }
     
    class Tata{
     
    }
    En réalité une instance de Tata ne peut pas exister à l'extérieur d'un instance de Toto. Une instance de Tata est créée, modifiée ou supprimée uniquement à l'aide de méthodes contenu dans Toto. Je veux donc eviter absolument qu'on puisse écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $mytata=new Tata();
    $mytata->tatamethode();
    PHP4 n'est pas terrible niveau objet et d'apres ce que j'ai lu sur PHP5, il se rapproche beaucoup plus des autres langages objets. Comme en Java par exemple j'aurais résolu le probleme en déclarant Tata comme classe interne à Toto avec l'attribut private, je me demandais si c'était possible en PHP5.
    Si ca ne l'est pas, est ce que vous voyez une solution pour protéger l'acces à ma classe Tata ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    bon ba c'est le patern proxy qui correspond a tes besoins

    ce qu je comprend pas c'est cette notion de class prive(connais pas java et c#)(une class seulement accessible par une autre)

    je crois qu'Epox en a deja parlé sur l'un de mes postes je vais faire une petite recherche

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    je vais jeter un oeil au patern proxy. Merci pour ta réponse !

    En Java ou en C# (je ne suis pas non plus un spécialiste, je suis programmeur PHP et Java et C# j'en fais sur mon temps libre, donc je suis loin d'être expert), l'attribut private s'applique à l'interieur d'une classe, mais il peut tout a fait être utilisé pour une classe si cette classe est interne à une autre. Donc tu ne peux pas ecrire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Toto{
     
    }
    private class Tata{
     
    }
    Par contre tu peux tout a fait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Toto{
      private class Tata{
     
      }
     
    }
    Il y a peut être des cas ou on peut utiliser private à l'extérieur d'une classe en C# mais la ca sort du domaine de mes compétences Voila, je dis juste comment j'ai pu utiliser ca, et c'est dommage qu'on ne puisse pas faire ca en PHP car c est bien utile !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    faute de frappe
    il fallait lire:"bon ba c'est pas le patern proxy qui correspond a tes besoins"

    pas contre peut etre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class toto
    {
    }
     
    class tata
    {
    public __construct(toto $toto)
    {
    }
    }
    comme ceci peut etre si l'objet passer a tata n'est pas du type de toto ca plante

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    Ok merci pour la correction

    Donc, d'apres ton code je dois passer en paramètre au constructeur l'instance Toto pour laquelle je souhaite créer une instance de Tata.
    Ca m'amène à quelques questions :
    -est ce que je dois faire figurer dans ma classe Tata un champ de type Toto de tel sorte que lorsque le constructeur est appelé, le champ Toto de Tata prenne la valeur $toto du constructeur ?
    -dans exemple tu spécifies "toto $toto", donc tu types ton paramètre $toto, c'est normal ? Dans quels cas peut on typé un paramètre ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    est ce que je dois faire figurer dans ma classe Tata un champ de type Toto de tel sorte que lorsque le constructeur est appelé, le champ Toto de Tata prenne la valeur $toto du constructeur ?
    ca ne 'apporte pas grans chose car tu veut appeler tata a travers toto??

    pour ce qui du typage cela ne fonctionne qu'avec les objets

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    Oui, mais ce que je ne comprends pas c'est comment l'objet Tata conserve l'information $toto si je ne le stocke pas dans une variable ? enfin la je pense que c'est parce que je connais tres peu PHP5 et que je devrais me documenter sur la méthode _construct(). Je vais aller regarder ca.

    Je comprends le " " concernant le variable non typée, je partage ton

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    ....et c'est dommage qu'on ne puisse pas faire ca en PHP car c est bien utile !
    Pour ce qui est des classes internes tout est dit !

    Quand à en faire un equivalent en php je voit pas 36 solutions :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class toto 
    { 
    protected $tata;
    public function __construct()
    {
    $this->tata = new tata();
    }
    } 
    class tata { }
    sachant qu'en PHP il n'y à pas le mot clé internal, et que l'on ne peut pas déclarer une classe au sein d'une classe c'est un peu raté.
    Je pourrait toujours si l'envie m'en prends instancié un objet tata.

    Pour ce qui est de passé une référence de toto dans le constructeur de tata je n'en ai pas bien saisi le besoin, mais j'ai surement raté un truc.

    :/

    bye

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut, une question pour améliorer ma culture G : d'un point de vue conceptuel (mais concrètement), à quoi sert-il de déclarer une classe dans une autre ?

  13. #13
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Et quel est le besoin fonctionnel ? Pourquoi vouloir à tout prix faire une inner class ?

  14. #14
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut
    on fait une class interne pour les meme raisons que l'on utilise des variables locales et non des variables globales.

    le code "propre" c'es qd on sait se relire ;-) chacun sa méthode, il y a des concepts généraux interessant mais si il existait une marche a suivre simple et sans equivoque, il y aurait deja qqn qui aurait programmé un informaticien
    Le but de tout developpeur OO est de devenir une référence.
    Mon avatar est un ambigramme, les curieux peuvent le retourner ;-)
    Aider <> Faire a la place de!!!

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/01/2013, 13h15
  2. Réponses: 2
    Dernier message: 13/05/2008, 10h02
  3. Réponses: 2
    Dernier message: 02/02/2008, 07h37
  4. Réponses: 14
    Dernier message: 10/02/2007, 13h27
  5. Class interne dans une classe template
    Par MatRem dans le forum Langage
    Réponses: 26
    Dernier message: 15/06/2006, 10h45

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