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 :

Nom classe où est instancier une autre classe [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Points : 283
    Points
    283
    Par défaut Nom classe où est instancier une autre classe
    Bonjour,

    est il possible de connaitre le nom de la classe (et son dirname) où elle est instancié, depuis la classe appelée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A {
      public function meth1(){
        $b = new B();
        $b->meth2();
      }
    }
    class B {
      public function meth2(){
        // J'aimerai obtenir l'objet A
      }
    }
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Pour faire ceci, il faut que tu ajoutes des descripteurs à tes classes. Mois je les mets sous forme de constantes. Voici un exemple correpondant à ta problématique :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
     
    class A {
     
       # Descripteurs de classe
       const __SELF__ = __CLASS__;
       const __FSRC__ = __FILE__;
       const __NSPC__ = __NAMESPACE__;
     
       function meth1(){
          $b = new B();
          $b->meth2($this);
       }
    }
     
    class B {
       function meth2($a){
          $className = basename($a::__SELF__);
          $file      = $a::__FSRC__;
          $namespace = $a::__NSPC__;
          $dir       = dirname($file);
       }
    }
     
    ?>

  3. #3
    Membre actif Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Points : 283
    Points
    283
    Par défaut
    Ma méthode meth2() permet de faire une traduction et actuellement je fais comme cela
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->meth2('txt', dirname(__FILE__))
    Mon but aurait été de supprimer le 2ème argument pour qu'il soit connu dans la classe B sans lui passer un argument, à la manière de get_called_class()

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Général03 Voir le message
    Mon but aurait été de supprimer le 2ème argument pour qu'il soit connu dans la classe B sans lui passer un argument, à la manière de get_called_class()
    Cela me semble infaisable ainsi. Le seul moyen est de factoriser ton code par la base. Puis d'identifier les appelants entre eux via une des constantes descriptives de la classe.
    Pour un exemple concret regardes comment j'ai procédé avec ma classe d'i18n ici. Le travail est fait par la classe de base et l'identification des classes appelantes se fait par des appels à

  5. #5
    Membre actif Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Points : 283
    Points
    283
    Par défaut
    Oui je pensais faire le même principe que tu me proposes. Je me disais au cas où il existe une autre méthode que je ne connais pas.
    Merci

  6. #6
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    get_class() ???

    en plus c'est le contraire de ce qu'il faut faire. Je veux dire qu'une classe en a rien a faire ou elle s'instancie puisqu'elle est rangée proprement dans ton systeme et qu'elle va être trouvée automatiquement par l'autoload.

    c'est assez bisarre comme façon de faire... j'arrive pas à imaginer l'utilité très sérieuse du tout.
    regarde ça aussi: http://www.developpez.net/forums/d11...z/class-debug/

    même si ça gère pas les namespaces...

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pour être certain que B::meth2 reçoive bien une instance de A, il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class B {
      public function meth2 (A $a) {
         // on aura soit une instance de A soit null
      }
    }
    Si tu veux son dirname, regarde du coté des réflécteurs.

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    je sais que le sujet est clos mais si on déclare

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Class A {
    function foo(){return 'foo';}
    }
     
    function xyz(A $a)
    {
    	echo $a->foo();
    }
     
    xyz(null);

    alors on obtient
    Catchable fatal error: Argument 1 passed to xyz() must be an instance of A, null given, called in ... and defined in ...

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

Discussions similaires

  1. Réponses: 34
    Dernier message: 24/09/2014, 20h26
  2. Réponses: 3
    Dernier message: 02/03/2010, 08h16
  3. Attribut d'une classe du type d'une autre classe
    Par Ragnarok666 dans le forum Débuter
    Réponses: 12
    Dernier message: 14/04/2009, 17h43
  4. recuperer une variable d'une autre classe: s'est y possible
    Par areuh_fr dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 30/11/2008, 15h25
  5. [CSS] Classe héritant déf d une autre classe?!
    Par Trunks dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/01/2006, 23h43

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