2 questions POO PHP5

2 questions POO PHP5 - PHP - Programmation

Marsh Posté le 28-02-2006 à 13:38:04    

3 questions:
 
- peut on contourner le fait de ne pas pouvoir en PHP5, créer plusieurs constructeurs ?
 
- les énumérations ca existe en PHP5 ?
 
- je pige pas tres bien la notion d'interface et de clase abstraite. Les docs que je trouve sur le net ca m'aide pas plus.
 
pouvez vous m'eclairer sur ces questions ?
 
merci

Reply

Marsh Posté le 28-02-2006 à 13:38:04   

Reply

Marsh Posté le 28-02-2006 à 13:41:14    

une interface , pour simplifier, est une sorte de classe pour laquelle tu dois obligatoirement redéfinir les fonctions qui sont présentes dans son corps.

Code :
  1. public interface inter
  2. {
  3.     function salut();
  4. }


 
quand tu implémenteras ca, tu devras définir le corps de la fonction salut();
 
Une classe abstraite ne peut pas etre appelée directement, on doit créer une classe qui en hérite pour pouvoir l'utiliser. Par contre tu n'auras pas a redéfinir les fonctions, contrairement à l'interface.
 
Pour le reste, je me suis pas aventuré dans les méandres du php5, je peux pas t'aider désolé  :hello:

Message cité 1 fois
Message édité par benamoubeach le 28-02-2006 à 13:44:59
Reply

Marsh Posté le 28-02-2006 à 14:14:44    

pour le reste, disons que j'avais utilisé la surcharge de méthodes et les énumération en C# et j'avais trouvé ca tres pratique.
Maintenant, les fonctionnalités de POO sont tres liées au degré de typage du langage.
et vu que C# est tres typé puisque quasi full objet et PHP5 ne l'est pas trop...
 
Concernant l'interface :
quel est l'interet de definir le corps de la fonction salut() ailleurs ?  
je veux dire : quelle est la différence entre :
- mettre la signature de la fonction dans l'interface et la définir dans une classe qui l'implément
- définir directement la fonction dans une classe, sans utiliser d'interface  
 
Concernant la classe abstraite:
quel est l'interet de ne pas instancier directement la fonction, et devoir instancier seulement la classe non abstraite qui définit le corps de classe abstraite dont elle hérite .
 
quand je dis "quel interet", j'entend pas là "dans quelle situation c'est utile"

Reply

Marsh Posté le 28-02-2006 à 14:18:10    

jokari34 > Quel est l"intéret? Pouvoir créer des classes dont un certain nombre de fonctions auront des noms et des listes de paramêtre identique.
Pourquoi faire ça? Par ce qu'on a parfois besoin d'apeller différents objets appartenant à des classes différentes et ce sans toucher au code qui va les manipuler.

Reply

Marsh Posté le 28-02-2006 à 14:58:03    

Voila, omega2 t'a donné la réponse pour ta question sur les interfaces.
 
Pour les classe abstraites, disons que tu veux représenter une fac . Tu vas faire une classe Personne. Mais tu veux différencier les Etudiants des Prof. Donc les classes Etudiant et Prof auront les memes fonctions , les memes variables, mais ca voudrait rien dire d'instancier une Personne , car c'est forcément un Prof ou un Etudiant. Donc Etudiant et Prof hériteront de Personne.


Message édité par benamoubeach le 28-02-2006 à 14:58:43
Reply

Marsh Posté le 28-02-2006 à 15:02:02    

benamoubeach a écrit :

une interface , pour simplifier, est une sorte de classe pour laquelle tu dois obligatoirement redéfinir les fonctions qui sont présentes dans son corps.


Une interface c'est un contrat, et une classe implémentant une interface s'engage à respecter le contrat spécifié par l"interface :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-02-2006 à 15:31:34    

Ca revient a dire quelque chose comme :
 
Le contrat est :
" les classes X, Y et Z doivent contenir la fonction truc() "  
 
Le respect du contrat est fait ainsi :  
"les classes X Y et Z doivent implementer l'interface I_monInterface
afin de les obliger a définir le corps de la fonction truc()"
 
ca revient a ca ?
 
Concernant la classe abstraite,  
l'interet c donc de specialiser une classe.
la classe Personne est abstraite car elle ne correspond à aucune entité physique, dans la mesure où ce sont les classes filles héritantes qui déterminent l'entité physique (spécialisation)

Reply

Marsh Posté le 28-02-2006 à 16:09:14    

j'ai bon ?

Reply

Marsh Posté le 28-02-2006 à 16:20:01    

pour les classes abstraites, c'est une classe comme les autres, sauf que tu ne l'utiliseras jamais en tant que telle. Tu utiliseras les classes qui en sont héritees. Donc ça te permet de créer une classe contenant toutes les méthodes communes à tes classes héritées (logique), en interdisant d'instancier cette classe abstraite. L'exemple de benamoubea ch est pas mal.
 
Sinon tu peux faire de la surcharge en PHP, énumération je sais pas. Ca peut peut-être t'aider pour ton constructeur ? Tu ne peux pas déclarer plusieurs constructeurs à une classe, mais tu peux surcharger les constructeurs des classes héritées.

Reply

Marsh Posté le 28-02-2006 à 16:33:01    

Un petit exemple pratique d'interface pour Jokari :
 
On s'intéresse au jeu Sudoku. Il existe plusieurs algo pour sa résolution. Pour rendre le code flexible, on décide de créer une interface SodukuSolverInterface. Selon la technique de résolution, on aura SodukuSolverBacktracking (par backtracking) et SudokuSolverDancingLinks (pour l'algo du même nom).
 
Avantage : sauf à l'endroit ou on décide de la stratégie à utiliser, le reste du code ne connaitra que des SudokuSolver, laissant la porte ouverte à d'autres classes s'attachant à la résolution.
 
Tu trouveras notament des interfaces p.e. dès lors que tu utilises des plugins. Je laisse la possibilité, dans tel programme, de programmer une opération particulière, à condition de respecter le contrat.
 
Classes abstraites : +1 benamou.
 
Tu peux combiner les deux : une interface, une classe abstraite qui "implémente" l'interface ("implements" en Java, comme c'est mal choisi, hein ?), et des classes concrètes qui héritent de la classe abstraite.
 
Tu as bien pigé les deux concepts, MAIS la classe qui "implémente" l'interface ne le fait pas forcément, si elle est abstraite ! (là encore, je parle Java, pour PHP, chais pas).


Message édité par sircam le 28-02-2006 à 16:33:40

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 28-02-2006 à 16:33:01   

Reply

Marsh Posté le 28-02-2006 à 16:34:53    

C'est marrant de voir que tout le monde, moi le premier , raisonne d'abord en java :)

Reply

Marsh Posté le 28-02-2006 à 16:37:22    

Oui, beh, raisonner OO en PHP, c'est presque contre nature !
 
Enfin, on ne raisone pas OO en Java, on raisonne OO en OO, mais pour la pratique, on pense Java ou C++ ou Eiffel ou SmallTalk, c'est plus correct.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 28-02-2006 à 16:38:26    

C'est sur que la poo en php, faudra attendre un petit peu :)

Reply

Marsh Posté le 28-02-2006 à 16:43:06    

C'est possible, mais ça sent le réchauffé, le forcé pour dire qu'on a de l'OO, pour se donner une contenance. C'est un peu dommage.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 28-02-2006 à 16:45:01    

Ca va venir , c'est la tendance actuelle de php de s'orienter petit à petit vers de l'objet sans brusquer tout le monde. Par contre faudrait virer __contruct et son ami destruct

Reply

Marsh Posté le 28-02-2006 à 17:53:00    

sircam a écrit :

Enfin, on ne raisone pas OO en Java, on raisonne OO en OO, mais pour la pratique, on pense Java ou C++ ou Eiffel ou SmallTalk, c'est plus correct.


Ca c'est la théorie, en pratique il y a un monde entre la "JavaOO" et la "SmalltalkOO" ou la "RubyOO"...


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-02-2006 à 17:55:25    

benamoubeach a écrit :

Ca va venir , c'est la tendance actuelle de php de s'orienter petit à petit vers de l'objet sans brusquer tout le monde. Par contre faudrait virer __contruct et son ami destruct


 
euh m'étonnerait que ça arrive, ça, ils ont débarqué en php5 alors qu'avant on faisait comme les copains une fonction qui avait le même nom que la classe pour le constructeur...[:petrus75]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-02-2006 à 17:59:13    

masklinn a écrit :

Ca c'est la théorie, en pratique il y a un monde entre la "JavaOO" et la "SmalltalkOO" ou la "RubyOO"...


Ouais, et il faut justement éviter de "penser Java" uniquement, pour ne pas être contaminé.
 
Sans doute trop tard pour moi. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 28-02-2006 à 19:18:12    

skeye a écrit :

euh m'étonnerait que ça arrive, ça, ils ont débarqué en php5 alors qu'avant on faisait comme les copains une fonction qui avait le même nom que la classe pour le constructeur...[:petrus75]


 
Ouais et je trouve que c'est une belle connerie  :kaola:  :kaola:  :kaola:

Reply

Marsh Posté le 28-02-2006 à 19:19:36    

bah si on pouvait en coller plusieurs avec des paramètres différents je m'en foutrais pas mal, perso.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-02-2006 à 19:21:52    

ben je vois pas pourquoi ils ont fait ca , a part pour se différencier des autres langages, et pour repérer rapidement lors de la lecture, je vois pas trop l'intéret :)

Reply

Marsh Posté le 28-02-2006 à 20:27:26    

skeye a écrit :

euh m'étonnerait que ça arrive, ça, ils ont débarqué en php5 alors qu'avant on faisait comme les copains une fonction qui avait le même nom que la classe pour le constructeur...[:petrus75]


Si "les copains" désigne les "brace languages" (C++, Java, C#) alors pourquoi pas, mais c'est rapidement pas le cas: c'est pas le cas en objective-c, c'est pas le cas en Perl (même si l'OO Perl5 est du niveau PHP4 à tout pêter), c'est pas le cas en Python, c'est pas le cas en Ruby, c'est probablement pas le cas en Smalltalk mais il faudrait vérifier.
 
Après, il est stupide que ça ait changé entre PHP4 et PHP5, mais c'est un autre problème.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed