Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/08/2011, 09h32   #1
Membre confirmé
 
Avatar de Général03
 
Inscription : avril 2006
Messages : 809
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 809
Points : 220
Points : 220
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 :
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
__________________
Mes contributions phares en dev : www.rigaudie.fr
Général03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 10h00   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 551
Points : 2 551
Envoyer un message via Skype™ à rawsrc
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 :
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);
   }
}
 
?>
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 10h13   #3
Membre confirmé
 
Avatar de Général03
 
Inscription : avril 2006
Messages : 809
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 809
Points : 220
Points : 220
Ma méthode meth2() permet de faire une traduction et actuellement je fais comme cela
Code php :
$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()
__________________
Mes contributions phares en dev : www.rigaudie.fr
Général03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 10h53   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 551
Points : 2 551
Envoyer un message via Skype™ à rawsrc
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 à
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 11h02   #5
Membre confirmé
 
Avatar de Général03
 
Inscription : avril 2006
Messages : 809
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2006
Messages : 809
Points : 220
Points : 220
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
__________________
Mes contributions phares en dev : www.rigaudie.fr
Général03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h55   #6
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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...
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 18h01   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 987
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 987
Points : 5 017
Points : 5 017
Pour être certain que B::meth2 reçoive bien une instance de A, il suffit de faire:
Code :
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 18h58   #8
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
je sais que le sujet est clos mais si on déclare

Code php :
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
Citation:
Catchable fatal error: Argument 1 passed to xyz() must be an instance of A, null given, called in ... and defined in ...
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h26.


 
 
 
 
Partenaires

Hébergement Web