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 26/11/2010, 11h13   #1
Membre confirmé
 
Inscription : avril 2006
Messages : 507
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 507
Points : 239
Points : 239
Par défaut [POO] recupérer un attribut de la classe mère

Bonjour à tous

J'ai besoin d'un ptit conseil...

J'essaye de récupérer dans une classe fille une variable de la classe mère, en l'occurrence la connexion à la base de donnée.


admetons que ceci est ma classe mère :

Code :
1
2
3
4
5
6
7
8
9
10
class afficheActivite
{
protected $BDD;
 
public function __construct($bdd){
 $this->BDD=$bdd;
 $this->BDD->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
 
}
et que je veuille recuperer la connection à la BDD dans la classe fille

Code :
1
2
3
4
5
6
7
8
9
10
class recherche extends afficheActivite
{
 
public function __construct(){
 $this->BDD=parent->BDD;
 $this->BDD->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
}
 
}
dans ce cas j'obtiens :

Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /home/www/e4bae0ff07045d753c0/web/class/recherche/recherche.class.php on line 8

j'ai essayé aussi avec l'opérateur ::

Mais avec aussi peu de réussite...

Comment est ce que je peux définir que le $this->BDD de la classe fille est la variable $BDD de la classe mère ?

Merci d'avance pour vos réponses
Alexdezark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 11h40   #2
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 834
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 834
Points : 3 312
Points : 3 312
$this->BDD est accessible dans ta classe fille , tu dois simplement appeler le constructeur mère dans la classe fille pour initialiser la connexion.

Code :
1
2
3
4
5
6
7
8
9
10
class recherche extends afficheActivite
{
 
public function __construct($bdd){
 parent::__construct($bdd);
 $this->BDD->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 
}
 
}
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 13h00   #3
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Citation:
Envoyé par Alexdezark Voir le message
$this->BDD=parent->BDD;
Y a un langage où ça aurait du sens ?


Citation:
Envoyé par grunk Voir le message
Code :
1
2
3
4
5
6
 
public function __construct($bdd){
 parent::__construct($bdd);
 $this->BDD->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 
}
Le setAttribute est fait dans le parent, donc :

Code :
1
2
3
4
 
public function __construct($bdd){
 parent::__construct($bdd); 
}
Et si il n'y a rien d'autre dans _construct() dans la classe fille, autant le supprimer, le constructeur parent n'est pas appelé SI il est redéfini dans la classe fille ;-)
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 13h39   #4
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 834
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 834
Points : 3 312
Points : 3 312
Citation:
Envoyé par Joker-eph Voir le message
Y a un langage où ça aurait du sens ?




Le setAttribute est fait dans le parent, donc :

Code :
1
2
3
4
 
public function __construct($bdd){
 parent::__construct($bdd); 
}
Et si il n'y a rien d'autre dans _construct() dans la classe fille, autant le supprimer, le constructeur parent n'est pas appelé SI il est redéfini dans la classe fille ;-)
J'avais surtout laisser le setAttribute pour qu'il est un exemple d'utilisation de l'objet ,mais tu as raison.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 13h53   #5
Membre confirmé
 
Inscription : avril 2006
Messages : 507
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 507
Points : 239
Points : 239
Merci pour vos réponses

Ce qui me vient à l'esprit directement c'est pourquoi chercher à récuperer la connection à la base de données si je la redonne en paramètre lors de l'instanciation de ma classe fille ?

Citation:
public function __construct($bdd){
parent::__construct($bdd);
$this->BDD->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

}
là cela veut bien dire que j'ai re-fourni le paramètre lors de l'instanciation de ma classe non ?

Or ce que je cherche à faire c'est à ne pas re-fournir ce paramètre mais à utiliser celui qui est présent dans la classe mère.

C'est pourquoi j'essayai avec :

Code :
$this->BDD=parent->BDD;
ce qui cherche à dire que l'attribut BDD de ma classe fille est égal à celui de la classe mère.

Ce n'est évidement pas tout ce que contient mon constructeur et ce n'est pas non plus le seul attribut que je voudrais récuperer dans ma classe mère.

Ma question est : comment utiliser la connexion utilisée dans ma classe mère dans ma classe fille ?

Merci d'avance pour vos réponses
Alexdezark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 14h39   #6
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Il faut que tu révises la base de la POO, et notamment l'héritage

Il n'y a pas 2 attributs, un pour la classe mère et un pour la classe fille, mais un seul attribut qui est définit dans la classe mère et hérité dans la classe fille.

Donc

Code :
1
2
3
4
5
6
7
 
public function __construct($bdd){
  parent::__construct($bdd);
  // $this->bdd EST initialisé dans la classe mère
  // on peut l'utiliser...
 
}
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 14h59   #7
Membre chevronné
 
Inscription : mars 2005
Messages : 583
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 583
Points : 651
Points : 651
J'ai l'impression qu'il y a une mauvaise compréhension de la POO et de l'héritage.
Déjà, classe mère, classe fille ça n'existe pas. Ou du moins utiliser ces termes est source de confusion.
Classe mère -> Superclasse (ce qui ne veut pas dire grand chose dans le langage commun, et c'est tant mieux)
Classe fille -> classe dérivée ou spécialisation (le dernier terme étant ma manière de voir la chose)

Une superclasse factorise les membres ou/et méthodes communs à collection de classes différentes (les classes dérivées)
Une classe dérivée ajoute des membres ou/et méthodes à une classe (superclasse) pour répondre à une problématique particulière.

A partir du moment où on oublie la notion d'une relation "familiale" quelconque entre des classes, il est facile de comprendre qu'une instance de X et une instance de Y dérivant de X n'ont rien à voir entre elles. Tout comme deux instances de X n'ont pour unique rapport que d'être des objets de type X.

Message intentionnellement obscur pour imposer une réflexion ou un questionnement un peu profonds sur la question. En espérant qu'il reste tout de même compréhensible
__________________
Pourfendeur de singletons en croisade
Petibidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 15h47   #8
Membre confirmé
 
Inscription : avril 2006
Messages : 507
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 507
Points : 239
Points : 239
Ok, Merci à tous pour vos réponses

Je faisais effectivement un mélange...

J'essayai d'instancier d'abord ma classe mère (je continue de l'appeler comme ça désolé) puis ma classe fille alors qu'il suffisait d'instancier uniquement ma classe fille en lui fournissant les paramètres attendus.

D'ou plus besoin de constructeur dans cette classe puisque c'est celui de la classe mère qui est utilisé.

J'ai encore un peu de mal à m'expliquer parce qu'il faut d'abord que je comprenne bien tout ça, mais le principal : ça fonctionne comme je l'attendais.

Je vais certainement comprendre de mieux en mieux au fur et à mesure que je vais l'utiliser.

Merci encore.
Alexdezark 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 20h25.


 
 
 
 
Partenaires

Hébergement Web