IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] Problème de classes


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut [Système] Problème de classes
    Bonjour,

    Je suis actuellement en train de développer une série de classes pour faciliter la manipulation d'images en PHP 5 et je suis confronté à un petit problème de conception.

    Je possède une classe Image abstraite avec plusieurs classes qui en dérivent (ImageGIF, ImageJPEG, etc). Chaque classe dérivée permet donc de charger et de sauvegarder une image dans le même format. Le problème c'est que je me suis aperçu que l'on pouvait créer une image jpeg et la sauvegarder dans un autre format. Les possibilités sont donc étendues alors que l'architecture de mes classes est limitée.

    Une des solutions serait de créer une fonction de sauvegarde dans la classe Image et de faire des 'Si .. Alors .. Sinon' pour tester l'extension du nom de fichier passé en paramètre et réaliser le traitement souhaité. Cette solution n'est pas très élégante et n'exploite pas la puissance de la P.O.O. Auriez-vous d'autres idées ? Merci d'avance


    Nico.

  2. #2
    Membre Expert
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Par défaut
    Salut,

    peux-tu nous poster ton code : les classes en question et le procédural instanciant ces objets, afin qu'on puisse y voir plus clair ?

    merci

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    sinon peut etre un objet transversal qui se charge du transcriptage

  4. #4
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Voici le code des différentes classes :

    La classe image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <?php
    abstract class Image
    {
    	// Variables members
    	protected $m_Filename;
    	protected $m_ImageHandler;
     
     
    	// Methods
    	public function __construct()
    	{
    		$this->m_Filename     = "";
    		$this->m_ImageHandler = "";
    	}
     
    	public abstract function Create( $Filename );
     
    	public function GetWidth()
    	{
    		$infos = @getimagesize($this->m_Filename);
     
    		if( $infos )
    			return $infos[0];
     
    		return -1;
    	}
     
    	public function GetHeight()
    	{
    		$infos = @getimagesize($this->m_Filename);
     
    		if( $infos )
    			return $infos[1];
     
    		return -1;
    	}
     
    	public abstract function GetType();
    	public abstract function Show();
     
    	public function __destruct()
    	{
    		@imagedestroy($this->m_ImageHandler);
    	}
    }
    ?>
    La classe ImageJPEG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <?php
    require_once('image.class.php5');
     
    class ImageJPEG extends Image
    {
    	// Methods
    	public function Create( $Filename )
    	{
    		$this->m_ImageHandler = @imagecreatefromjpeg($Filename);
     
    		if( $this->m_ImageHandler )
    		{
    			$this->m_Filename = $Filename;
    			return true;
    		}
     
    		return false;
    	}
     
    	public function GetType()
    	{
    		return "JPEG";
    	}
     
    	public function Show()
    	{
    		if( $this->m_ImageHandler )
    		{
    			header("Content-type: image/jpeg");
    			@imagejpeg($this->m_ImageHandler);
    		}
    	}
    }
    ?>
    Le fichier de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    require_once('image_jpeg.class.php5');
     
    $image = new ImageJPEG();
    $image->Create('pics/bsd_daemon.jpg');
    $image->Show();
    ?>

  5. #5
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Citation Envoyé par stunti
    Sinon tu determines l'extension et avec un attern factory tu instance la bonne classe. Cette classe doit implementer une methode sauvegarder (definie dans une interface) que tu appelle sur la classe ressortant de la factory.

    c clair ?
    Je ne vois pas trop comment appliquer le design pattern factory à cet exemple. Pourrais-tu me dire comment tu t'y prendrai ? Merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    par exemple dans ta class abstraite image tu definie la methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract public function transcrypte( $type , $ressource )
    cette methode appelle la bonne class et cree(grace a la ressource) l'objet voulue et le retourne

    je crois que c'est l'idee maintenant ca fait longtemps que je n'ai pas joué avec les images

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $jpg = new JPG('monimage.jpg)
    $gif = $jpg->transcrypte('gif', $jpg);
    $gif->save('monimage.gif');

  7. #7
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    en fonction du nom de l'image avec un petit preg_match tu recupere l'extension.

    ensuite dans une methode statique :

    C un peu a la limite du pseudo code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?
    abstract class ImageFactory {
         static function getInstance($filename) {
    		if(preg_match('#^(.*)\.(.*)?]$#',$filename, $match)) {
    			$classname = {'Image'.$match[2]};
    			return new $classname;
    		}
    		else {
    			throw new Exception('Type de fichier inconu');
    		}
         }
    }
     
     
    $class_origine = ImageFactory::getInstance('toto.jpg');
    $class_destination = new ImageGif();
     
    $class_destination->save($class_origine->getImage());
     
     
    ?>

    J'ai pas teste, fait ca de tete.
    C surement a adapter en fonction des besoins, mais ca devrait servir de base.

  8. #8
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    Sinon tu determines l'extension et avec un attern factory tu instance la bonne classe. Cette classe doit implementer une methode sauvegarder (definie dans une interface) que tu appelle sur la classe ressortant de la factory.

    c clair ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] Problème avec les méthodes d'une classe
    Par oussama127 dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2006, 09h18
  2. Problème de classe
    Par DeusXL dans le forum DirectX
    Réponses: 15
    Dernier message: 04/12/2005, 14h37
  3. Problème de classe
    Par tidou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/10/2005, 17h49
  4. [FLASH MX2004] Problème de classe
    Par JulPoWeR dans le forum Flash
    Réponses: 1
    Dernier message: 10/07/2005, 22h51
  5. Réponses: 5
    Dernier message: 19/04/2005, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo