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 :

Qui a créé l'objet ? [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut Qui a créé l'objet ?
    Bonjour,

    Un petit dev en PHP dont je suis loin d'être un habitué m'amène ici pour une petite question.
    Je crée une classe Client.
    J'ai besoin de bloquer la création directe d''instance de cette classe .
    Une seconde classe ClientManager seule doit servir de factory et pouvoir créer une instance de Client.
    Écrire la fonction qui crée l'instance dans ClientManager, pas de problème.
    Ce que j'imaginais, c'est de mettre une instruction dans le construct de Client pour savoir "QUI" a déclenché le construct.
    Un genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( get_class(laclassequimaappele) != 'ClientManager' ) {
      echo "vas voir ailleurs";
    }
    Est-ce que ce genre de chose est possible ?

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Si une instance de ta classe ClientManager n'a besoin que d'une instance de ta classe Client, tu peux très bien utiliser l'héritage et utiliser get-called-class() dans Client.

    Tu peux aussi définir la classe Client comme abstraite pour éviter qu'elle ne soit instanciée.

    Une autre possibilité est d'utiliser debug_backtrace() au sein du constructeur de Client. Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $deb = debug_backtrace();
    if (count($deb) === 2 && $deb[1]['class'] === 'ClientManager') {
        // do something
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Pour l'héritage, dans le contexte, ce n'est pas possible.
    Merci pour l'idée du debug_trace très intéressante.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/04/2010, 16h49
  2. Segmentation d'images qui contiennent un seul objet
    Par bilzzbenzbilz dans le forum Traitement d'images
    Réponses: 15
    Dernier message: 09/03/2009, 03h36
  3. fonction qui renvoie un un objet d'une autre classe
    Par miloon dans le forum Débuter
    Réponses: 3
    Dernier message: 16/02/2009, 20h45
  4. [j3d] afficher une ligne qui point vers un objet
    Par guitalca dans le forum 3D
    Réponses: 1
    Dernier message: 06/03/2006, 21h44

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