OVH Cloud OVH Cloud

conception de class.

6 réponses
Avatar
Etienne SOBOLE
salut.

j'ai developpé un client mail (encore un ;) )
et je me pose une question de conception de class.

j'ai une class mail
et deux class pop et imap qui heritent de la class mail !

dans une variable php j'ai le type de compte de l'utilisateur
$sTypeMail = 'IMAP' par exemple

actuellement je fais
if ($sTypeMail == 'IMAP)
$oMail = new ClassIMAP(...);
else
$oMail = new ClassPOP3(...);

ma question est la suivante!
comment faut il procédé en POO pour ne pas devoir inclure les deux class!

je pourrais faire:
if ($sTypeMail == 'IMAP)
{
include('/.../imap.inc');
$oMail = new ClassIMAP(...);
}
else
{
include('/.../pop3.inc');
$oMail = new ClassPOP3(...);
}

mais je me demande s'il n'existe pas un procédé permettant de rendre ca plus
simple...
en fait j'aimerai avoir plutot un
$oMail = new ClassMail($sTypeMail);
qui me renverrai soit une instance de ClassIMAP soit une instance ClassPOP3.

voila.
merci
Etienne

6 réponses

Avatar
ftc

j'ai une class mail
et deux class pop et imap qui heritent de la class mail !
[SNIP]

en fait j'aimerai avoir plutot un
$oMail = new ClassMail($sTypeMail);
qui me renverrai soit une instance de ClassIMAP soit une instance ClassPOP3.


$mail = ClassMail::createInstance( $type );

class ClassMail {

...

function & createInstance( $type ) {
switch( $type ) {
case 'IMAP':
require_once( 'imap.class.php');
return new IMAP();
case 'POP3':
require_once( 'pop3.class.php' );
return new POP3();
}
}
}

Avatar
loufoque
Etienne SOBOLE a dit le 25/06/2005 à 10:02:

en fait j'aimerai avoir plutot un
$oMail = new ClassMail($sTypeMail);
qui me renverrai soit une instance de ClassIMAP soit une instance ClassPOP3.


On utilise le pattern factory.
$oMail = ClassMail::factory($sTypeMail);

Avatar
Etienne SOBOLE
On utilise le pattern factory.
$oMail = ClassMail::factory($sTypeMail);


voila c'est ca que je cherche.. et ca marche comment?
cf message précédent.

est on obligé de passer par une 4 eme class ???
sachant que j'ai deja mes deux class IMAP et POP3 qui herite de Mail !

Etienne

Avatar
Etienne SOBOLE
$mail = ClassMail::createInstance( $type );
class ClassMail {
function & createInstance( $type ) {
switch( $type ) {
case 'IMAP':
require_once( 'imap.class.php');
return new IMAP();
case 'POP3':
require_once( 'pop3.class.php' );
return new POP3();
}
}
}


oui mais effectivement ca me fait passé par une 4 eme class, ce que je
voudrais éviter si possible.
Etienne

Avatar
loufoque
Etienne SOBOLE a dit le 26/06/2005 à 15:57:

voila c'est ca que je cherche.. et ca marche comment?
cf message précédent.


C'est exactement la même chose que ce qu'a proposé ftc.


est on obligé de passer par une 4 eme class ???
sachant que j'ai deja mes deux class IMAP et POP3 qui herite de Mail !


Généralement on fait comme ça.

abstract class Mail_Common { }
class IMAP extends Mail_Common { }
class POP3 extends Mail_Common { }

class Mail
{
static public function &factory($className)
{
return new $className;
}
}

Avatar
ftc
oui mais effectivement ca me fait passé par une 4 eme class, ce que je
voudrais éviter si possible.


Tu peux intégrer cette fonction dans ta class Mail de base dont héritent
les classes POP3 et IMAP