Interface et classes abstraites en php5 et php6

Interface et classes abstraites en php5 et php6 - PHP - Programmation

Marsh Posté le 12-04-2006 à 14:51:54    

PHP6

Spoiler :


Bande de couillon  [:barome]  


 
 
Bonjours.
Je fais de l'objet mais sans aller plus loin parce que pour l'instant j'y ai pas eu trop d'interêt mais ne faisant le tour des possibilités en php5 je suis resté bloqué sur l'utilité concrète d'une "interface".  
d'après le le site php.net voici leur explication :

Citation :


 Les interfaces objet vous permettent de créer du code qui spécifie quelles méthodes et variables une classe peut implémenter, sans avoir à définir comment ces méthodes seront gérées.
 
Les interfaces sont définies en utilisant le mot clé interface, de la même façon qu'une classe standard mais sans aucun contenu de méthode.
 
Toutes les méthodes déclarées dans une interface doivent être publiques.
 

Code :
  1. <?php
  2. // Declaration de l'interface 'iTemplate'
  3. interface iTemplate
  4. {
  5.    public function setVariable($name, $var);
  6.    public function getHtml($template);
  7. }
  8. // Implémentation de l'interface
  9. // Ceci va fonctionner
  10. class Template implements iTemplate
  11. {
  12.    private $vars = array();
  13.    public function setVariable($name, $var)
  14.    {
  15.        $this->vars[$name] = $var;
  16.    }
  17.    public function getHtml($template)
  18.    {
  19.        foreach($this->vars as $name => $value) {
  20.            $template = str_replace('{' . $name . '}', $value, $template);
  21.        }
  22.        return $template;
  23.    }
  24. }




Avec l'explemple et le bout de code je comprend mais ma question est : A quoi ça sert ? dans quel cas j'en ai besoin.  [:ciler]
Merci !


Message édité par Berceker United le 14-04-2006 à 09:20:34
Reply

Marsh Posté le 12-04-2006 à 14:51:54   

Reply

Marsh Posté le 12-04-2006 à 15:07:13    

L'exemple est un peu bidon.
On utilise les interfaces, aussi appelé class abstraite en programmation objet, quand on a plusieurs type d'objets qui ont des méthodes (fonctions) en commun.
Les classes et objets créés sont dit polymorphes.
Celà permet, sans connaître le type exact des objets, de les utiliser de la même manière.
 
Pour donner un exemple (pas forcément utile en PHP), tu peut créer une interface flux. Flux gère un flux de donné, qui peut provenir de diverses sources possibles: fichier, connexion HTTP,  connexion FTP, buffer mémoire. Chaque flux possède une interface commune:
- ouvrir()
- lire()
- écrire()
- fermer()
 
Il est facile avec cette interface de connecter deux flux ensembles, à l'aide de lire() et écrire(). Ainsi une seule fonction peut transférer les données de n'importe quel flux vers n'importe quel autre: sauvegarder une page web dans un fichier, poster un fichier sur un ftp, charger un fichier en mémoire, etc...

Reply

Marsh Posté le 12-04-2006 à 15:16:14    

Sans vouloir dévier du sujet

nargy a écrit :

es interfaces, aussi appelé class abstraite en programmation objet


Pour moi c'est pas la même chose :o
 

Reply

Marsh Posté le 12-04-2006 à 15:17:15    

Ok je comprend le principe et ça commence à bien m'intéresser puisque via ton exemple j'y vois déjà un interêt. En fait, je peux faire un peut pret la même chose pour passer une information issu d'un type de SGBD à un autre type.  
Etant donnée que le bout de code présent au dessus est bidon et n'apporte pas grand chose peux tu me donner un exemple avec un juste un squelette stp ? :jap:
merci

Reply

Marsh Posté le 12-04-2006 à 15:18:06    

anapajari a écrit :

Sans vouloir dévier du sujet
 
Pour moi c'est pas la même chose :o


( [:romf] )


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

Marsh Posté le 12-04-2006 à 15:18:20    

nargy a écrit :


On utilise les interfaces, aussi appelé class abstraite en programmation objet,


Selon mes souvenirs, une interface et une classe abstraite sont 2 choses bien distinctes.
 
 
Edit: grilled


Message édité par benamoubeach le 12-04-2006 à 15:18:41
Reply

Marsh Posté le 12-04-2006 à 15:22:49    

classe abstraite != d'interface
 
une classe abstraite est une classe qui ne sera jamais instanciée, mais qui comprends bel et bien des méthodes (avec un corps), des attributs, etc.
Concrètement, à utiliser quand vous avez besoin de faire un héritage pour plusieurs classes, mais que la classe parente ne vous servira pas (elle est donc juste là pour l'héritage).
 
Une interface, comme disait je sais plus qui sur ce forum, c'est un contrat : en implémentant une interface, vous garantissez que la classe possèdera toutes les méthodes, noms, attributs, listés dans l'interface.
Un exemple peut-être des classes gerant le multilangue : une classe Langue_Fr et une classe Langue_En.  
En implémentant une interface pour ces deux classes, vous garantirez ne pas avoir oublié une méthode, ce qui se soldera par un message d'erreur sur l'une de vos pages en fonction de la langue.
 
Après comme dirait Masklinn, en PHP c'est un peu de la fumisterie les interfaces, puisque ça ne vérifie même pas les types des arguments des méthodes.
Moi j'aime quand même bien, ça évite des bugs si un autre développeur reprend ton taf, et ça évite des erreurs d'inattention

Reply

Marsh Posté le 12-04-2006 à 15:24:22    

C'est pas hors sujet cela m'intéresse aussi les avis sont la bienvenu :
j'ai trouvé une définition et elle s'approche beaucoup d'une interface :

Citation :


Abstract :
Elle peut servir de classe de base à d’autres classes : ces sous-classes devront implémenter toutes les méthodes abstraites de la super-classe ou bien les déclarer abstraites


 

Citation :


Interface :
Une interface est une sorte de modèle auquel doivent se conformer les classes qui s’y réfèrent. On peut ainsi définir une interface pour une bibliothèque entière de classes


 
Source


Message édité par Berceker United le 12-04-2006 à 15:29:31
Reply

Marsh Posté le 12-04-2006 à 15:25:30    

Une interface est une classe abstraite sans membres et dont toutes les méthodes sont abstraites...[:jagstang]


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

Marsh Posté le 12-04-2006 à 15:28:29    

Djebel1 a écrit :

classe abstraite != d'interface
 
une classe abstraite est une classe qui ne sera jamais instanciée, mais qui comprends bel et bien des méthodes (avec un corps), des attributs, etc.
Concrètement, à utiliser quand vous avez besoin de faire un héritage pour plusieurs classes, mais que la classe parente ne vous servira pas (elle est donc juste là pour l'héritage).
 
Une interface, comme disait je sais plus qui sur ce forum, c'est un contrat : en implémentant une interface, vous garantissez que la classe possèdera toutes les méthodes, noms, attributs, listés dans l'interface.
Un exemple peut-être des classes gerant le multilangue : une classe Langue_Fr et une classe Langue_En.  
En implémentant une interface pour ces deux classes, vous garantirez ne pas avoir oublié une méthode, ce qui se soldera par un message d'erreur sur l'une de vos pages en fonction de la langue.
 
Après comme dirait Masklinn, en PHP c'est un peu de la fumisterie les interfaces, puisque ça ne vérifie même pas les types des arguments des méthodes.
Moi j'aime quand même bien, ça évite des bugs si un autre développeur reprend ton taf, et ça évite des erreurs d'inattention


 
Ok je pense que ça résume bien la différence entre les deux. Donc l'exemple de nargy sur l'utilité ne peut pas servir à cela.

Reply

Marsh Posté le 12-04-2006 à 15:28:29   

Reply

Marsh Posté le 12-04-2006 à 15:31:16    

skeye a écrit :

Une interface est une classe abstraite sans membres et dont toutes les méthodes sont abstraites...[:jagstang]


sauf qu'un classe peut implémenter plusieurs interfaces mais n'hériter que d'une classe abstraite non?

Reply

Marsh Posté le 12-04-2006 à 15:32:59    

anapajari a écrit :

sauf qu'un classe peut implémenter plusieurs interfaces mais n'hériter que d'une classe abstraite non?


dépend des langages, ça. ;)


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

Marsh Posté le 12-04-2006 à 15:49:58    

[:ouais2] ouais, ya chipotage là
Class abstraite pure finale ça vous convient mieux?
 
une exemple, avec SGBD.
Factorisation: pour toutes les BDD tu aura besoin de:
- ouvrir une bdd
- fermer une bdd
- envoyer une requête
- lire le résultat d'une requête
- libérer la mémoire occupé par un résultat
- récupérer un code d'erreur
 
Ce qui donne:
function open($host, $port, $user, $pass, $options);
function close();
function query($q);
function fetch($numrow=-1);
function flush();
function error();
 
Pour mysql:
function open($host, $port, $user, $pass, $options);
$this->db=mysql_connect($host, $port, $user, $pass, $options);
 
function close();
mysql_close($this->db);
 
function query($q);
$this-currentresult=mysql_query($q, $this->db);
 
function fetch($numrow=-1);
return mysql_fetch_array($this-currentresult, $numrow);
 
function flush()
mysql_free_result($this->currentresult);
 
function error();
return mysql_error();
 
NB: ma syntaxe mysql est très vague, à vérifier dans la doc, j'ai simplifié mais il faudrait aussi faire les tests necessaires sur les ressources Mysql.

Message cité 1 fois
Message édité par nargy le 12-04-2006 à 15:51:18
Reply

Marsh Posté le 12-04-2006 à 15:54:28    

nargy a écrit :

[:ouais2] ouais, ya chipotage là
Class abstraite pure finale ça vous convient mieux?
 
une exemple, avec SGBD.
Factorisation: pour toutes les BDD tu aura besoin de:
- ouvrir une bdd
- fermer une bdd
- envoyer une requête
- lire le résultat d'une requête
- libérer la mémoire occupé par un résultat
- récupérer un code d'erreur
 
Ce qui donne:
function open($host, $port, $user, $pass, $options);
function close();
function query($q);
function fetch($numrow=-1);
function flush();
function error();
 
Pour mysql:
function open($host, $port, $user, $pass, $options);
$this->db=mysql_connect($host, $port, $user, $pass, $options);
 
function close();
mysql_close($this->db);
 
function query($q);
$this-currentresult=mysql_query($q, $this->db);
 
function fetch($numrow=-1);
return mysql_fetch_array($this-currentresult, $numrow);
 
function flush()
mysql_free_result($this->currentresult);
 
function error();
return mysql_error();
 
NB: ma syntaxe mysql est très vague, à vérifier dans la doc, j'ai simplifié mais il faudrait aussi faire les tests necessaires sur les ressources Mysql.


Donc une interface est là pour garantir l'implémentation des methodes définit dans l'interface.

Reply

Marsh Posté le 12-04-2006 à 15:56:17    

> Donc une interface est là pour garantir l'implémentation des methodes définit dans l'interface.
- exact
- je te laisse deviner ce qu'il faut ajouter pour faire la même chose avec postgres et odbc. ensuite tu peut utiliser uniformément l'une ou l'autre de ces BDD dans tes scripts PHP.

Reply

Marsh Posté le 12-04-2006 à 16:00:20    

il est possible de mélanger une interface et un héritage ?


Message édité par Berceker United le 12-04-2006 à 16:22:12
Reply

Marsh Posté le 12-04-2006 à 16:02:12    

bah oui, tu peux très bien avoir
 
class truc extends chose implements machin{
...
}


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

Marsh Posté le 12-04-2006 à 16:04:35    

dans un language objet pure (PHP faut voire, il me semble que c'es ok) tu peut utiliser autant de combinaisons d'interfaces, de classes hérités que souhaité, et de définitions de membres supplémentaires.

Reply

Marsh Posté le 12-04-2006 à 16:05:55    

skeye a écrit :

bah oui, tu peux très bien avoir
 
class truc extends chose implements machin{
...
}


 

nargy a écrit :

dans un language objet pure (PHP faut voire, il me semble que c'es ok) tu peut utiliser autant de combinaisons d'interfaces, de classes hérités que souhaité, et de définitions de membres supplémentaires.


 
C'est d'la bombe ça  [:negueu]

Reply

Marsh Posté le 12-04-2006 à 16:06:46    

nan, php supporte pas l'héritage multiple. :o


Message édité par skeye le 12-04-2006 à 16:07:00

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

Marsh Posté le 12-04-2006 à 16:08:28    

Il y a que c++ qui le supporte il me semble.

Reply

Marsh Posté le 12-04-2006 à 16:11:25    

il n'y a pas grand chose qui le supporte, oui... :o


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

Marsh Posté le 12-04-2006 à 16:14:42    

nargy a écrit :

dans un language objet pure (PHP faut voire, il me semble que c'es ok) tu peut utiliser autant de combinaisons d'interfaces, de classes hérités que souhaité, et de définitions de membres supplémentaires.


pas dans tous les langages malheureusement. (ou heureusement)
En java par exemple, tu ne peux pas hériter de deux classes à la fois et pourtant, c'est un langage purement objet. (tout le code dois être dans des classes ou des interfaces)
Le C++, par contre, est un langage objet (mais pas totalement objet) permettant d'utiliser des fonctions n'appartement à aucune classe (petit héritage du C) permet de faire de l'héritage multiple.
 
Comme quoi même en question d'interface et d'héritage, il n'y a pas de régle absolut disant ce qu'il est possible ou pas de faire dans un langage simplement objet ou totalement objet.

Reply

Marsh Posté le 12-04-2006 à 16:25:44    

Un classe qui implémente une interface doit avoir à l'identique les methodes ou elle peut en avoir en avoir plus dans la meme classe  
ex :
 

Code :
  1. Interface IClassA{
  2.   Function A(){}
  3.   Function B(){}
  4. }
  5. Class ClassB implements iClassA{
  6.   Function A(){
  7.     ...
  8.   }
  9.   Function B(){
  10.     ...
  11.   }
  12.   Function C(){
  13.     ...
  14.   }
  15. }

Reply

Marsh Posté le 12-04-2006 à 16:35:02    

skeye a écrit :

Une interface est une classe abstraite sans membres et dont toutes les méthodes sont abstraites...[:jagstang]


Tout à fait.  
La distinction provient uniquement de certains langages qui ne permettent pas l'héritage multiple :jap:

Reply

Marsh Posté le 12-04-2006 à 16:38:34    

skeye a écrit :

Une interface est une classe abstraite sans membres et dont toutes les méthodes sont abstraites...[:jagstang]


tout à fait, mais il y a bien une différence entre "extends" et "implements". Et c'est plutôt à ce niveau là que se situe la différence entre interface et classe abstraite au final, mais tu as tout à fait raison.

Reply

Marsh Posté le 12-04-2006 à 20:16:56    

smaragdus a écrit :

Tout à fait.  
La distinction provient uniquement de certains langages qui ne permettent pas l'héritage multiple :jap:


Pas vraiment non. Une classe abstraite peut très bien décider de mettre une méthode final pour garantir qu'une sous-classe n'ira pas corrompre sont fonctionnement. Cela peut s'avérer très util lorsque tu dois définir un parttern de factory. Et ceci, c'est tout à fait indépendant de l'héritage multiple ou non. Si l'on considére que l'intreface s'apparente à un contrat, la classe abstraite s'apparenterait plus à un texte lacunaire, une partie de l'info existe déjà, à toi de combler les blancs.

Reply

Marsh Posté le 12-04-2006 à 20:26:31    

Berceker United a écrit :

Il y a que c++ qui le supporte il me semble.


Il te semble vachement mal.
 
Maintenant si on se restreint à C++, Java et PHP ([:pingouino]) alors oui

gizmo a écrit :

Pas vraiment non. Une classe abstraite peut très bien décider de mettre une méthode final pour garantir qu'une sous-classe n'ira pas corrompre sont fonctionnement. Cela peut s'avérer très util lorsque tu dois définir un parttern de factory. Et ceci, c'est tout à fait indépendant de l'héritage multiple ou non. Si l'on considére que l'intreface s'apparente à un contrat, la classe abstraite s'apparenterait plus à un texte lacunaire, une partie de l'info existe déjà, à toi de combler les blancs.


Le monsieur te dit que les interfaces correspondent à un cas particulier des classes abstraites: les classes abstraites dont toutes les méthodes sont abstraites [:itm]
 
Et il a parfaitement raison [:itm]
 
D'ailleurs en C++ on implémente les interfaces... via des classes abstraites [:itm]


Message édité par masklinn le 12-04-2006 à 20:27:36

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

Marsh Posté le 12-04-2006 à 21:09:24    

Dans ce cas tu vas m'expliquer comment faire un constructeur dans une interface [:itm]

Reply

Marsh Posté le 12-04-2006 à 21:12:26    

gizmo a écrit :

Dans ce cas tu vas m'expliquer comment faire un constructeur dans une interface [:itm]


T'es au courant qu'on est pas obligé de définir un constructeur? [:itm]
 
Et qu'une classe abstraite ne peut pas plus être construite qu'une interface? [:itm]
 
Je vais te donner un conseil: lis le GoF, tu découvriras probablement plein de trucs [:itm]


Message édité par masklinn le 12-04-2006 à 21:13:33

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

Marsh Posté le 12-04-2006 à 21:13:14    

oui, et si je VEUX le définir, fais comment avec une interface?

Reply

Marsh Posté le 12-04-2006 à 21:15:32    

gizmo a écrit :

oui, et si je VEUX le définir, fais comment avec une interface?


Arrêter d'être stupide me semblerait être une bonne idée pour commencer, si tu réfléchissais 3 secondes tu te rendrais probablement compte que ta question a autant de sens que "comment je fais pour nager un 100m crawl dans un volcan en éruption" [:itm]


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

Marsh Posté le 12-04-2006 à 21:30:38    

berceker >> un exemple concret d'utilisation des interfaces en Java. récemment, j'ai eu à coder un programme qui opérait des traitements sur une base Oracle ou une base Access. les traitements étaient identiques.
 
voici le code :

Code :
  1. private BddUpdater bdUpdater; // BddUpdater est une interface
  2. (...)
  3. // puis l'utilisateur choisit la base à updater. une fois qu'il a choisi, je créé mon BddUpdater :
  4. if (option.equals("Access" )) {
  5.     bdUpdater = new AccessUpdater(this);
  6. } else if (option.equals("Oracle" )) {
  7.     bdUpdater = new OracleUpdater(this);
  8. }


tu saisis ? les classes AccessUpdater et OracleUpdater implémentent toutes les deux l'interface BddUpdater, et donc implémentent ses méthodes. tout ce que j'ai à faire, c'est d'appeler les méthodes d'update à partir de mon BddUpdater, le polymorphisme me garantit ensuite que la méthode correspondant à la base utilisée sera appelée.
 
pour bien faire, il faudrait faire générer l'updater par un factory, ça permettrait de supporter d'autres SGBD sans toucher au code métier, mais bon, vu que je me cassais de la boite, j'avais pas trop envie de me casser le cul :D

Message cité 1 fois
Message édité par Harkonnen le 12-04-2006 à 21:37:23

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-04-2006 à 21:44:35    

Berceker United a écrit :

Un classe qui implémente une interface doit avoir à l'identique les methodes ou elle peut en avoir en avoir plus dans la meme classe


elle peut en avoir plus, tant qu'elle implémente les méthodes de l'interface. une classe ne peut pas avoir moins de méthodes que l'interface qu'elle implémente, mais le contraire est tout à fait possible


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-04-2006 à 22:02:23    

gizmo a écrit :

Si l'on considére que l'intreface s'apparente à un contrat, la classe abstraite s'apparenterait plus à un texte lacunaire, une partie de l'info existe déjà, à toi de combler les blancs.


 
Et une interface c'est une classe abstraite spéciale où il n'y a que des blancs à combler, tu confirmes donc ce que je dis :lol:
L'interface, c'est juste un truc inventé (par java ?) pour pallier au manque d'héritage multiple de certains langages objet.  
 
D'ailleurs en java, y a des classes "XXXImpl" qui implementent les interfaces "IXXX" pour combler ce manque mais qui oblige à agreger l'implementation en plus d'heriter de l'interface au lieu de simplement hériter d'une classe abstraite qui serait partiellement définie : double lourdeur donc  [:zytrahusathome]
 

Citation :

oui, et si je VEUX le définir, fais comment avec une interface?


 
tu veux definir un constructeur d'une classe qui n'est pas instanciable ? LOL  [:zytrafumay]

Message cité 2 fois
Message édité par smaragdus le 12-04-2006 à 22:06:01
Reply

Marsh Posté le 12-04-2006 à 22:04:05    

smaragdus a écrit :


L'interface, c'est juste un truc inventé pour pallier au manque d'héritage multiple de certains langages objet.


l'héritage multiple, c'est juste un truc inventé pour pallier au manque d'interfaces de certains langages objet


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-04-2006 à 22:06:42    

Harkonnen a écrit :

l'héritage multiple, c'est juste un truc inventé pour pallier au manque d'interfaces de certains langages objet


 
LOL, tu ferais mieux de te renseigner sur l'histoire de l'informatique  [:zytrahusathome]
La programmation objet existait avant java, tu sais ça ?
 
(A reflexion con, reflexion con et demi  [:catharsis] )

Message cité 1 fois
Message édité par smaragdus le 12-04-2006 à 22:11:49
Reply

Marsh Posté le 12-04-2006 à 22:13:53    

smaragdus a écrit :

LOL, tu ferais mieux de te renseigner sur l'histoire de l'informatique  [:zytrahusathome]
La programmation objet existait avant java, tu sais ça ?


oui, et sais tu que l'humour au second degré existait déjà chez les sumériens ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-04-2006 à 22:17:28    

Harkonnen a écrit :

l'héritage multiple, c'est juste un truc inventé pour pallier au manque d'interfaces de certains langages objet


Harkonnen a écrit :

oui, et sais tu que l'humour au second degré existait déjà chez les sumériens ?


Ouais mais l'humour c'est mieux quand c'est drôle, là il n'y a aucune relation entre ta déclaration et la réalité historique donc bon s'pas très très drôle [:pingouino]


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

Marsh Posté le 12-04-2006 à 22:24:44    

c'était juste pour souligner le coté absurde de la réflexion de Smaragdus qui disait que les interfaces n'étaient là que pour pallier au manque d'héritage multiple. si vraiment c'était le cas, pourquoi un langage comme C#, sorti bien après Java, ne supporte pas l'héritage multiple ?
l'héritage multiple, pour aussi pratique qu'il soit, amène aussi son lot de soucis, et c'est pour ça que Java ou C# ont fait le compromis de supporter les interfaces à la place. dire que les interfaces sont là pour pallier au manque d'héritage multiple est une connerie sans nom


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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