Début en héritage

Eléphant du PHP | 398 Messages

11 févr. 2009, 17:06

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;
	}
}
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Mammouth du PHP | 684 Messages

11 févr. 2009, 17:55

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();
?>
Zigz4g

Eléphant du PHP | 398 Messages

11 févr. 2009, 18:05

Ce n est donc pas parent::xxx que je dois utiliser ?
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Mammouth du PHP | 684 Messages

11 févr. 2009, 18:18

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.
Zigz4g

Eléphant du PHP | 398 Messages

12 févr. 2009, 18:45

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 :)
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe