Connaitre le nom d'une classe enfant (sans l'instancier)

Connaitre le nom d'une classe enfant (sans l'instancier) - PHP - Programmation

Marsh Posté le 22-10-2008 à 11:00:53    

Bonjour,
 
j'ai une classe "Common"
 
et plusieurs classes enfant héritant de la classe Common.
 
On va prendre l'exemple de la classe "Membre" qui hérite donc de la classe common.
 
J'ai créé une fonction  
 

Code :
  1. Common::Exists()


 
qui est sencé tester dans la BDD si un ID existe ou pas en fonction de la table de la classe courante.
Mais bon la n'est pas le probleme.
 
J'ai besoin de récupérer le nom de la classe  qui appelle la fonction Common::Exists().
 
Le truc c'est que si je fais ceci :

Code :
  1. Membre::Exists()


 
et que dans ma fonction Exists je fais un /
 

Code :
  1. echo get_class();


 
Il affiche "Common", hors je voudrais pouvoir connaitre quel classe a appeler cette fonction!
 
Si j'instancie un objet ca marche mais justemetn j'ai besoin de pouvoir utiliser cette fonction sans instancier un objet...
 
Y a-t-il une astuce que j'aurais zappé ? J'ai lu et relu la doc de PHP je ne trouve rien a ce sujet...
Maintenant si y a pas de solution... tant pis :(  
 
D'avance merci!  
 
Gat$


Message édité par Gat$ le 22-10-2008 à 11:04:20
Reply

Marsh Posté le 22-10-2008 à 11:00:53   

Reply

Marsh Posté le 22-10-2008 à 11:03:54    

ça me semble logique que  si tu instancie un objet de classe common, il se comporte comme un objet de classe common, et pas comme un d'une de ses classes filles
 
ceci dit, je ne comprends pas comment tu appelle Membre:Exists() dans un objet de type common ?

Reply

Marsh Posté le 22-10-2008 à 11:06:42    

flo850 a écrit :

ça me semble logique que  si tu instancie un objet de classe common, il se comporte comme un objet de classe common, et pas comme un d'une de ses classes filles
 
ceci dit, je ne comprends pas comment tu appelle Membre:Exists() dans un objet de type common ?


 
Je n'instancie rien justement!
 
- Membre hérite de Common.
- La fonction "Exists" est dans la classe Common, mais est appeler depusi la classe Membre : Membre::Exists();
 
Q. Comment connaitre ce qui est en gras souligné a l'interieur de la fonction Exists() sans devoir instancier un objet Membre en dehors ?
 
Voila simplement ma question :)


Message édité par Gat$ le 22-10-2008 à 11:07:19
Reply

Marsh Posté le 22-10-2008 à 11:09:11    

je dois etre fatigué , mais Exist est une fonction statique ?

Reply

Marsh Posté le 22-10-2008 à 11:11:46    

Ca n'est possible qu'à partir de PHP 5.3, avec l'implémentation du late static binding.

 

Si tu n'as pas la 5.3, il n'y a strictement aucun moyen, dans une méthode statique, de récupérer le nom de la classe enfant [:sadnoir] Ca a niqué bon nombre d'implémentations d'ActiveRecord.


Message édité par FlorentG le 22-10-2008 à 11:11:53
Reply

Marsh Posté le 22-10-2008 à 11:13:54    

Le seul moyen serait d'avoir des méthodes Exists dans tes classes filles, qui appellerait explicitement une autre méthode dans Common, genre :
 

Code :
  1. class Common
  2. {
  3.  
  4.  public static function _Exists($type)
  5.  {
  6.     ...
  7.   }
  8.  
  9. }


et

Code :
  1. class Membre extends Common
  2. {
  3.  
  4.  public static function Exists()
  5.  {
  6.    return Common::_Exists('Membre');
  7.  }
  8.  
  9. }


Message édité par FlorentG le 22-10-2008 à 11:16:24
Reply

Marsh Posté le 22-10-2008 à 11:14:01    

flo850 a écrit :

je dois etre fatigué , mais Exist est une fonction statique ?


 
Non.
 

Code :
  1. class common {
  2.  public function Exists($id=NULL) {
  3.   // Table courante
  4.   $cur_table=get_class();
  5.   // utilisation de l'id de l'objet courant si $id est NULL et si l'objet existe
  6.   if(is_null($id))  {
  7.    if(is_object($this)) {
  8.     $id=$this->data[$cur_table]['id'];
  9.    }
  10.   }
  11.   // Check de l'existance dans la BDD  
  12.   $data=common::sql("
  13.    SELECT `" . $cur_table . "`.`id`
  14.    FROM `" . $cur_table . "`
  15.    WHERE `" . $cur_table . "`.`id` = '" . intval($id) . "'
  16.   " );
  17.   return ($data[0][$cur_table]['id'] > 0 ? true : false);
  18.  }
  19. }


 
 

Code :
  1. class membre extends common {
  2.  ...
  3. }


 
 
Et si je fais :  
 

Code :
  1. membre::Exists();


 
Aucun moyen de savoir avec quel classe je l'ai appelée, voila tout mon probleme.
Maitenant si ya pas de solution, dite le et je trouverai autre chose :)
 
En fait $cur_table prendra la valeur "common" et devrait dans mon cas contenir "membre"  
 
Merci pour tes reponses


Message édité par Gat$ le 22-10-2008 à 11:15:33
Reply

Marsh Posté le 22-10-2008 à 11:14:37    

Comme dit, pas de solution, faut bricoler comme dans mon 2ème post

Reply

Marsh Posté le 22-10-2008 à 11:15:52    

Ok au moins je suis fixé, merci a toi ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed