Page 1 sur 1

Début en héritage

Posté : 11 févr. 2009, 17:06
par BaLiSTiK
Pour le besoin du site que je developpe, j ai decidé d'utiliser l heritage (c etait aps forcement requis...mais faut bien apprendre ^^). Je me suis renseigné un peu sur ce topic qui m a l'air interessant, mais sans resoudre mon soucis : http://www.phpfrance.com/forums/voir_sujet-244982.php
Je possede deux classe :
Expert qui est ma classe mere, et expert_attente, sa classe fille
La classe mere est comme ceci :
class expert{
	
	/** Attribut **/
	public $id_expert;
	public $pseudo;
	public $email;
	public $m_bMessage;
	
	/** Constructeur **/
	function __construct($id_expert,$pseudo){
	
		$this->m_nAccesBD = new connexionBD();
		$this->id_expert= $id_expert;
		$this->pseudo = $pseudo;
	}
	
	/** Methode retournant les informations d'un user **/
	function _infoExpert($aTable){
	
		$this->m_nAccesBD->connexion(); //Connexion BD
		/*** Requete SQL recuperation info user ***/
		$sRequete = 'SELECT * FROM '.$aTable;
		$sRequete .= ' LEFT JOIN type_expert';
		$sRequete .= ' ON '.$aTable.'.type_expert = type_expert.id_expert';
		$sRequete .= ' LEFT JOIN categorie';
		$sRequete .= ' ON '.$aTable.'.num_categorie = categorie.id_categorie';
		$sRequete .= ' WHERE pseudo = "'.$this->pseudo.'"';
		$sRequete .= ' AND id_personne = '.$this->id_expert;
		/*** Traitement de la requete SQL  ***/	
		$rResultatInfoExpert = $this->m_nAccesBD->requete($sRequete);
		echo $rResultat;		
		$this->m_nAccesBD->deconnexion(); //Deconnexion	
		$this->m_aInfoExpert = array();
		return $this->m_aInfoExpert = mysql_fetch_array($rResultatInfoExpert);
	}
	
	function __tostring(){
		$class = __CLASS__;
		return 'Vous etes ds la classe '.$class;
	}
Et voila sa classe fille :
//le require_once(class_mere); se trouve ds un fichier de configuration ailleurs
class expert_attente extends expert{
	
	/** Attribut **/
	public $id_expert_attente;
	public $pseudo_attente;
	public $m_bMessage;
	
	/** Constructeur **/
	function __construct($id_expert_attente,$pseudo_attente){
		parent::__construct($id_expert_attente,$pseudo_attente);
	}
	
	/** Methode **/
	function _infoExpertAttente(){
		$aTable = 'expert_attente';
		parent::_infoExpert($aTable);
	}
	
	function __tostring(){
		return parent::__tostring();
	}
}
Le soucis est que si je souhaite utiliser la methode _infoExpertAttente(), en allant voir la methode _infoExpert (y a juste le nom de la table sql a changé pr avoir des infos de experts ou experts_attente), je n ai rien.
voila mon simple code sensé afficher :
$oExpert->m_nListeExpertAttente = $oExpert->_listeExpAttente(); //Methode retournant la liste des experts en attente, se trouvant ds la classe expert
if(empty($oExpert->m_nListeExpertAttente)){
	echo '<p>Pas d\'experts en attente de validation</p>';
}else{
	foreach($oExpert->m_nListeExpertAttente as $aListeExpertAttente){
		echo 'Creation de l objet expert_attente avec : '.$aListeExpertAttente['id_personne'].' et '.$aListeExpertAttente['nom'].'<br />';
						
		$oExpertAttente = new expert_attente($aListeExpertAttente['id_personne'],$aListeExpertAttente['nom']); //Creation de l objet d expert en attente
		$oExpertAttente->_infoExpertAttente();
						
		echo 'Class instanci&eacute;e : '.get_class($oExpertAttente).'<br />';
		echo 'Class mere : '.get_parent_class($oExpertAttente).'<br />';
		echo 'ToString : '.$oExpertAttente;
		//	echo '<pre>'; print_r($oExpertAttente->m_aInfoExpert); echo '</pre>';
						
		$affich = '<p>NOM : '.$oExpertAttente->m_aInfoExpert['nom'].'</p>';
		echo $affich;
	}
}

Posté : 11 févr. 2009, 17:55
par zigz4g
Salut,
regarde avec le bout de code que je donne ci-dessous :
<?php

class A
{
	public function move()
	{
		echo 'Je suis dans move()<br/>';
	}
	
	private function attach()
	{
		echo 'Je suis dans attach()<br/>';
	}
	
	protected function grip()
	{
		echo 'Je suis dans grip()<br/>';
	}
}

class B extends A
{
	public function kill()
	{
		$this->move();
		$this->grip();
	}
}

$b = new B();
$b->kill();
?>

Posté : 11 févr. 2009, 18:05
par BaLiSTiK
Ce n est donc pas parent::xxx que je dois utiliser ?

Posté : 11 févr. 2009, 18:18
par zigz4g
Dans la doc de PHP5 voici a quoi correspond la surcharge ->
Lorsqu'une classe étendue redéfinit une méthode de la classe parente, PHP n'appellera pas la méthode d'origine. Il appartient à la méthode dérivée d'appeler la méthode d'origine en cas de besoin. Cela est également valable pour les définitions des constructeurs et destructeurs, les surcharges et les méthodes magiques.


Dans ton cas, tu ne fais pas une surcharge de ta methode. Donc un appel a $this->taMethode() convient ou alors c'est ce que tu veux et dans ce cas faut renommer ta methode.

Posté : 12 févr. 2009, 18:45
par BaLiSTiK
J ai reussi a resoudre mon soucis d heritage je sais pas trop comment, m ais j arrive à acceder aux methodes de ma classe mere et bien avec parent::xxx() . c etait ce qui est marqué dans mon bouquin PHP 5.merci quand même :)