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 05/09/2007, 23h18   #1
Invité régulier
 
Inscription : mars 2005
Messages : 58
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 58
Points : 9
Points : 9
Par défaut [POO] Héritage : Surcharge d'un membre statique parent

Bonjour à tous ! J'ai un petit soucis dont je n'arrive pas à dénicher d'infos suffisantes pour m'aider. Je me demande même si c'est réellement possible...

J'ai deux classes : C1 et C2 qui hérite de C1
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class C1
{
	static $member = "defaut";
 
	function print_member()
	{
		echo self::$member."<br />";
	}
}
 
class C2 extends C1
{
	static $member;
 
	// Pleins de trucs sympas ^^
}
Mon soucis est le suivant : en fait j'ai une multitude de classes type C2 et je voudrais qu'elles aient chacune leur version de la valeur de $member qui est statique. Seulement si dans mon code je fais :
Code :
1
2
3
C2::$member = "youpi";
$c2 = new C2();
$c2->print_member();
C'est "defaut" qui est affiché et non "youpi" : il n'y a pas surcharge du membre statique à travers la fonction. Si je retire la ligne "static $member;" dans C2, alors à chaque nouvelle affectation de $member, toutes les classes filles de C1 auront le même membre.
Mon but c'est justement que la fonction soit la même pour tous mais qu'elle fasse intervenir le membre statique de chacun.

Pour la petite histoire, ce que je compte faire c'est affecter un nom de table MySQL à ce membre statique et créer des fonctions plutôt complexes utilisant ce membre dans les requêtes. Le but ultime étant bien évidemment de ne pas recopier chaque fonction de C1 dans chaque classe C2 et de garder le fait que ce membre soit statique (ainsi le nom de la table est commun à chaque objet de même classe C2).

Comment pouvoir surcharger un membre statique d'une classe mère et l'utiliser dans les fonctions non surchargées ? Est-ce possible en PHP5 ?

Merci de votre aide, et désolé si le sujet est déjà passé ; j'ai eu beau cherché j'ai pas trouvé mon bonheur !
Nullos Oracle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2007, 07h20   #2
Membre régulier
 
Avatar de B.Moncef
 
Étudiant
Inscription : août 2007
Messages : 75
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 75
Points : 83
Points : 83
Ce que tu veux faire dans ton code n'est pas possible. La seule solution si tu veux a tout prix garder ta variable statique, est de mettre la methode print_membre dans tes classes type C2. Mais apparemment tu ne veux pas ca.

Mais a la lecture de ton probleme, je ne comprends pas pourquoi tu veux a tout prix garder cette propriete statique. Un code comme cela ne te convient il pas ? >
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
26
27
<?php
 
class C1
{
    private $member = "defaut";
 
    public function print_member()
    {
	echo $this->member . "<br />";
    }
 
    public function setMember($newValue)
    {
        $this->member = $newValue;
    }
}
 
class C2 extends C1
{
    // Pleins de trucs sympas ^^
}
 
$c2 = new C2();
$c2->setMember('foo');
$c2->print_member();
 
?>
Tu peux egalement te passer de setMember en utilisant public au lieu de private dans la definition de $member. ?
B.Moncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2007, 16h18   #3
Invité régulier
 
Inscription : mars 2005
Messages : 58
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 58
Points : 9
Points : 9
Ok merci donc de ta confirmation, ne trouvant pas d'infos sur le net j'en avais pratiquement déduis que ce n'était pas possible. Le full object en PHP n'est pour l'instant qu'une utopie ...

Citation:
Mais a la lecture de ton probleme, je ne comprends pas pourquoi tu veux a tout prix garder cette propriete statique. Un code comme cela ne te convient il pas ?
Si si bien sûr que ça me convient ; c'est juste que ce n'est pas pratique d'affecter cette variable membre à chaque création d'objet de même classe C2 si sa valeur sera la même pour toutes les instances de C2. D'ou l'utilisation d'une variable statique pour affecter ce membre une seule fois pour toute.

Mon but était de trouver le moyen de factoriser au maximum mon code et éliminer quelques lignes superflues. Du coup, je pense être sur la bonne voie en dénichant un équivalent à utiliser une variable statique :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
class C1
{
	protected $parent_member;
 
	function print_member()
	{
		echo $this->parent_member."<br />";
	}
}
class C2 extends C1
{		
	static $member;
 
	function __construct()
	{
		$this->parent_member = C2::$member;
	}
}
Ca fonctionne mais... est-ce la meilleure idée ?
Nullos Oracle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2007, 16h47   #4
Membre chevronné
 
Inscription : mai 2005
Messages : 657
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 657
Points : 722
Points : 722
Salut,

Par rapport à ce que tu veux faire, voici un exemple qui me parait convenir :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class AbstractTable {
  abstract function getTableName();
 
  function requeteBidule()
  {
    return sprintf("SELECT * FROM %s", $this->getTableName());
  }
}
 
class TableBidule extends AbstractTable {
  function getTableName() { return "bidule"; }
}
 
 
$bidule = new TableBidule();
 
echo $bidule->requeteBidule();
Bien sur, ta méthode avec un membre peut aussi fonctionner. Mais les classes abstraites sont faites spécialement pour ça : définir "partiellement" des classes et forcer les implémentations (classes filles) à définir certaines fonctions.
D'ailleurs, le compilateur générera une erreur si on implémente pas getTableName() dans une classe fille :
Code :
1
2
3
4
class TableMachin extends AbstractTable {
}
 
-> Fatal error: Class TableMachin contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractTable::getTableName)
__________________
Toute la documentation Ruby on Rails : gotapi.com/rubyrails
Mes articles :
> HAML : langage de template pour Ruby on Rails
Taum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2007, 00h29   #5
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
En fait il est possible de surcharger les membres et méthodes en PHP5 à l'aide des méthodes magique __set et __get, on peut aussi s'aider des méthodes magiques __isset et __unset, essaye de regarder ici :
http://www.php.net/manual/fr/languag...verloading.php

J'ai essayer de comprendre mais il se fait tard la j'ai pas fini mon exemple :s je reviens demain si tu as toujours pas trouver mais cela doit être faisable.
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 08h10   #6
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Les methodes magiques ne sont executées qui si la méthode ou la propriété appelé n'est pas publique.
Par contre, si changer la valeur par défaut est votre seul problême, vous n'avez qu'a la changer dans le contructeur de la classe enfant après avoir éxécuté le contructeur parent.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 16h20   #7
Invité régulier
 
Inscription : mars 2005
Messages : 58
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 58
Points : 9
Points : 9
Citation:
Envoyé par is_null Voir le message
si changer la valeur par défaut est votre seul problême, vous n'avez qu'a la changer dans le contructeur de la classe enfant après avoir éxécuté le contructeur parent.
J'avais effectivement aboutit à cette conclusion ; je trouve pas ça pas pratique à 100% mais c'est apparemment la meilleure solution.

Merci à tous pour l'aide !
Nullos Oracle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 18h39   #8
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
En quoi n'est-ce-pas 100% pratique ?
Si vous voulez, j'ai une classe qui moud le cafe et une autre qui fait bouillir de l'eau
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null 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 14h35.


 
 
 
 
Partenaires

Hébergement Web