Page 1 sur 1

appel de methode parente

Posté : 13 sept. 2006, 09:38
par mcorgnet
Bonjour à tous,

j'ai une suite de classes :

1.class.php5
2.class.php5 -> include(1.class)
3.class.php5 -> include(2.class)

Bref, je veux faire appel à une méthode protégée dans le fichier 1.class, depuis le fichier 3.class (vous m'suivez ?).

Le souci, c'est que si il existera toujours un fichier 1.class, son nom change, et donc le nom de la classe, qui est inclue dynamiquement.

Vous m'suivez toujours ?

Comment faire ?

Merci,

Mathieu.

Posté : 13 sept. 2006, 09:46
par zeus
non, j'avoue que je ne te suis pas du tout :oops:

Comment une classe peut elle avoir un nom dynamique ? :-k

Mais toujours est-il que si ta classe 3 hérite de la classe 2 qui herite elle même de la classe 1, parent::nomDeLaMethode() te permet d'acceder aux methodes des classes meres ;)

Si la methode nomDeLaMethode() est définie dans la classe 1 et que la classe 2 herite de cette classe, cette methode est accessible dans la classe 2

Posté : 13 sept. 2006, 09:53
par mcorgnet
en fait, précision, c'est pas le nom qui est dynamique, mais j'ai plusieurs classes de paramètres en 1, et en fonction de l'instanciation de 3, j'inclus 1a ou 1b ... C'est mieux là ? C'est l'inclusion, en fait, qui est dynamique.

Mais j'ai oublié d'étendre ma classe 2 à ma classe 1, aussi pour ça que ça fonctionne pas l'appel de méthode parente.

J'corrige :d

Posté : 13 sept. 2006, 10:06
par mcorgnet
Bon en fait, le problème a complètement changé. Je ré-explique :

Je dois étendre ma classe 2 à ma classe 1 :
class 2 extends class 1 {

}
Le nom de ma classe 1 est toujours le même, par contre c'est le fichier inclus qui diffère. J'inclus 1a.php ou 1b.php, en fonction de différents paramètres. Mon souci, c'est que j'inclus le fichier dans 2.php APRES avoir étendu la classe.

en gros, j'ai mis les pneus avant la chambre à air.

J'ai besoin de déclarer en 3.php le nom du fichier à inclure, et je l'étends en 2.

Je sais pas comment faire, autrement. Vous avez une idée ?

Posté : 13 sept. 2006, 10:18
par zeus
Déjà, on ne dit pas "étendre" mais "hériter" ;)

Ensuite, je ne comprend pas pourquoi tu as besoin de plusieurs classes stockées dans des fichiers différents ? De même, comment est-ce que tu sais quel fichier utiliser ?

Posté : 13 sept. 2006, 10:28
par mcorgnet
Arf ... En fait, mes classes 1a et 1b font presque la même chose, elles ont les même methodes, le même nom de classe ...

La nuance, c'est le "presque". Par exemple (pour simplifier, c'est pas le cas ici), si quelqu'un veut créer une classe qui connecte à tous les types de bases de données : oracle, mysql ... il pourrait s'y prendre à peu près ainsi, en prévoyant un fichier pour chaque type de base.

Donc mon souci, c'est que j'ai ça :
<?php

class truc extends machin {

public method {
include($machin.".class.php");
}

}

?>
alors que je devrais avoir ça :
<?php
include ("maclasse.class.php");

class truc extends machin { 

}
?>

Posté : 13 sept. 2006, 10:37
par zeus
Effectivement, tu ne peut heriter d'une classe si le fichier qui la contient n'est pas inclu :?

Je te conseillerais presque de faire des classes différentes et de prévoir un fichier de configuration dans lequel tu définirais quelle classe appeller

Posté : 13 sept. 2006, 10:39
par mcorgnet
c'est effectivement ce que j'ai commencé à faire, à priori je ne vois pas de meilleure solution.

Je placerai ce post en résolu un peu plus tard, dès fois que quelqu'un aurait une autre solution.

Merci pour ton aide.

Posté : 13 sept. 2006, 10:44
par Cyrano
...en gros, j'ai mis les pneus avant la chambre à air...
Tu devrais peut-être essayer le tubeless ;)

Si on suit ton exemple de classes diverses selon le type de SGBD, il y aurait une autre option : l'interface. Une interface liste les méthodes qu'on retrouvera dans chacune des classes qui l'implémente. Donc tu auras quelque chose comme ceci :
<?php
interface monInterface
{
    public function methode1();
    public function methode2();
    public function methode3();
}
?>
Et dans les classes :
<?php
class maClasse1 implements monInterface
{
    public function methode1()
    {
        /* le code le la première méthode */
    }
    public function methode2()
    {
        /* le code le la seconde méthode */
    }
    public function methode3()
    {
        /* le code le la troisième méthode */
    }
}
?>
Partant de là, selon les paramètres utilisés, tu pourrais choisir la classe à charger.
Rien n'interdit en outre l'extension d'une classe parente en plus de l'implémentation, ce qui donnerait :
<?php
class maClasse1 extends maClasseParente implements monInterface
{
    public function methode1()
    {
        /* le code le la première méthode */
    }
    public function methode2()
    {
        /* le code le la seconde méthode */
    }
    public function methode3()
    {
        /* le code le la troisième méthode */
    }
}
?>
Ça ouvre la possibilité d'utiliser des méthodes de la classe parente qui seront de toutes façons les mêmes quels que soient tes paramètres de base et des méthodes spécifiques en fonction de paramètres particuliers.

Je ne sais pas si cette solution répond à ton problème, je ne suis pas certain de bien visualiser le nature de la difficulté exposée :-k

Posté : 13 sept. 2006, 11:21
par naholyr
Je pense que si tu en es à ce type de bidouille, c'est qu'il y a un problème de conception quelque part. Est-ce que tu veux essayer de nous expliquer un peu le projet et ce qui t'amène à vouloir générer des chemins dynamiques en fonctions de paramètres (passés sous forme de variables définies avant l'inclusion ?) ? On pourrait voir s'il n'y a pas une autre solution plus propre ;)

Posté : 13 sept. 2006, 11:29
par mcorgnet
En fait, j'ai trois fichiers différents de configuration, qui s'incluent en fonction d'une demande utilisateur. Un peu comme si c'étaient des css, dans le cas ou l'utilisateur voudrait un affichage différent.

En l'occurence, là, il s'agit de paramètres comptables (façon de parler, pour dire chiffres et calculs), des suites de chiffres et quelques méthodes qui font appel à ces chiffres. Si ça se limitait à des variables différentes, je changerais tout ça. Malheureusement, les calculs changent dans chaque fichier de paramètre ... Mes méthodes n'utilisent pas toujours les mêmes fonctions php, même si elles ont exactement la même trame (nom de classe, noms de methodes, nombre de méthodes).

Je suis ouvert à d'autres solutions, mon but était de faire toujours appel aux mêmes méthodes, et de n'avoir, au besoin, qu'à créer de nouveaux fichiers de paramètres.

Voui, c'est tordu ...

Posté : 13 sept. 2006, 11:36
par Cyrano
Et dans ce cas pourquoi pas simplement un switch qui définirait quel fichier inclure avant l'appel des méthodes ?

Posté : 13 sept. 2006, 11:43
par mcorgnet
C'est difficile à expliquer tout ça ...

Ya que le nom des fichiers qui change, finalement. Les méthodes appelées par les classes enfantes sont toujours les mêmes. Donc, je fais simplement un include($file); en quelques sorte.

Malheureusement, j'ai besoin d'appeler une méthode du fichier inclu avant son inclusion même.

Oui, je pense que quelque chose est mal foutu dans ce que j'ai fait.

Posté : 13 sept. 2006, 11:56
par mcorgnet
Cela dit, n'est-il pas possible de modifier l'héritage dans la classe même ?

du genre :
class myConf {

private test {
class myConf extends 1a.php;
}
}
ça résoudrait mon problème ..

Posté : 13 sept. 2006, 12:10
par Cyrano
Malheureusement, j'ai besoin d'appeler une méthode du fichier inclu avant son inclusion même.
Alors utilise une méthode statique.

Sinon, note bien que je ne suis pas un spécialiste très avancé sur la question, mais à mon avis, ton histoire doit pouvoir être résolue en utilisant le polymorphisme. L'idée générale consisterait à tester les paramètres envoyés pour inclure la classe appropriée.