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 :

Interfaces et redéfinition [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut Interfaces et redéfinition
    Bonjour à tous.

    Considérons l'exemple suivant:
    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
    interface Model {
    	public function __construct ($id = null);
    }
     
    abstract class BaseModel implements Model {
    	public function __construct ($id = null) {
    		var_dump($id);
    	}
    }
     
    class MySQLModel extends BaseModel {
    	public function __construct ($id = null) {
    		throw new RuntimeException('Missing $tbl parameter');
    	}
    	public function __construct ($tbl, $id = null) {
    		var_dump($tbl,$id);
    	}
    }
    Inutile de préciser que ça ne fonctionne pas en PHP, la redéfinition n'étant pas possible. J'ai cependant ce besoin, il faut que ma classe concrête MySQLModel implémente l'interface Model mais elle doit recevoir un paramètre supplémentaire sur son constructeur.
    Dès lors comment s'en sortir ? J'ai pensé à:
    • utiliser func_get_args
    • ajouter un argument arbitraire supplémentaire sur le prototype du constructeur dans l'interface (de type array) (que c'est moche)
    • enlever tous les paramètres du constructeur dans l'interface et laisser les classes filles se débrouiller avec func_get_args (ce qui rends l'interface 'achement utile !)
    • dégager l'interface
    • vous demander votre avis

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Peut être que l'hypothèse la plus raisonnable est la suivante:
    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
    interface Model {
    	public function __construct ($id = null);
    }
     
    abstract class BaseModel {
    	public function __construct ($id = null) {
    		var_dump($id);
    	}
    }
     
    class MySQLModel extends BaseModel {
     
    	protected $_table;
     
    	/**
    	 * Default constructor
    	 * @param string $tablename The MySQL tablename
    	 * @param mixed $id [optional] [default `null`] The row ID to match
    	 */
    	public function __construct ($id = null) {
    		$args = func_get_args();
    		if (empty($args))
    			throw new InvalidArgumentException("First parameters is missing");
     
    		if (!is_string($args[0]))
    			throw new InvalidArgumentException("Firt parameter is expected to be string, " . gettype($args[0]) . " given");
    		list($table,$id) = $args + array('', null);
     
    		if (empty($table))
    			throw new InvalidArgumentException("Invalid tablename");
     
    		$this->_table = $table;
    		parent::__construct($id);
    	}
    }
    Edit - et c'est ce que j'ai fait, c'est encore ce que je trouve de plus propre
    On ferme.

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

Discussions similaires

  1. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  2. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  3. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  4. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 09h51
  5. [VB6] [Interface] Icones de boutons de barre d'outils
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/09/2002, 15h50

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