Précédent   Forum des professionnels en informatique > PHP > Scripts
Scripts Forum d'entraide sur les scripts PHP téléchargés. Les meilleurs scripts PHP, la FAQ scripts PHP, toutes les FAQ PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2006, 12h25   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 69
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 69
Points : 58
Points : 58
Par défaut Méthode de "paramétrage" d'un objet

Salut,

Je suis en train de développer une petite classe et je me pose des questions quant à la manière d'en gérer la "configuration".
En fait, j'ai deux possibilités qui ne m'offrent pas forcément les mêmes avantages.

Je peux soit stocker la configuration dans un tableau et passer ce tableau en paramètre lors de l'instanciation de l'objet.
Avantage : lors de l'instanciation de l'objet, je peux effectuer certains traitements, en les incluant dans le constructeur.
Inconvénient : ça ne me plait que moyennement, je ne trouve pas ça très propre. Mais comme j'ai déjà vu faire ça dans un script, j'envisage la possibilité.

Autrement, je peux instancier l'objet et modifier les propriétés ensuite. Ceci m'oblige à définir une méthode qui exécutera les traitements "automatiques" à faire avant toute autre chose.
Avantage : ça me parait plus cohérent en terme de programmation.
Inconvénient : il faut nécessairement passer par une méthode supplémentaire pour l'exécution "automatique".

En fait, il s'agit d'une classe que je compte publier ensuite. Ceci a son importance du fait de l'ergonomie que je souhaite obtenir.
Avoir un fichier séparé dans lequel on définit la configuration, laquelle est ensuite chargée à l'instanciation de l'objet me parait facile à mettre en oeuvre pour un "utilisateur lambda".
Cependant, la deuxième méthode, similaire à Smarty, est tout à fait claire pour quelqu'un qui est habitué à la POO. Mais... elle m'empêche une exécution automatique à l'instanciation de l'objet...

J'ai parcouru vite fait quelques sujets qui s'apparentaient à mon problème, et j'ai vu qu'il était envisageable d'utiliser une classe pour la seule configuration. N'étant pas encore au top avec la POO en php, j'ai du mal à me rendre compte de comment ça pourrait fonctionner, des avantages et inconvénients.

Si vous avez un avis sur la question, je suis intéressé.
PseudoCoder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 13h29   #2
Membre chevronné
 
Avatar de kankrelune
 
Inscription : décembre 2005
Messages : 766
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 766
Points : 745
Points : 745
Salut... tout dépend de ce que tu entend par configuration (nombre de paramètres, etc)... .. .

Perso voici, en gros, comment je procède généralement... .. .

La configuration est stockée dans un attribut sous forme de tableau... .. .

Code :
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
class maClass
{
      var $_options;

      function __construct($param1 = 'pwet', $param2 = true, $param3 = 2)
      {
            $this->_options = array();
            $this->_options['param1'] = $param1;
            $this->_options['param2'] = $param2;
            $this->_options['param3'] = $param3;
      }

      function maClass($param1 = 'pwet', $param2 = true, $param3 = 2)
      {
            $this->__construct($param1, $param2, $param3);
            register_shutdown_function(array(&$this,'__destruct'));
      }

      function __destruct() { }

      function setOptions($options)
      {
            if(empty($options))
                  return true;
            
            $noError = true;
            
            foreach($otions as $option => $value)
            {
                  if(!$this->setOption($option,$value))
                        $noError = false;
            }
            
            return $noError;
      }
      
      function setOption($option,$value)
      {
            if(isset($this->_options[$option]))
            {
                  $this->_options[$option] = $value;
                  
                  return true;
            }
            return false;
      }
      
      function display()
      {
            if($this->_options['param2'])
            {
                  for($i=0;$i<$this->_options['param3'];++$i)
                        echo $this->_options['param1'].'<br />';
            }
            else echo $this->_options['param1'].'<br />';
      }
}

?>
ce qui fait que tu as possibilité de modifier tes options de plusieurs manière... à l'instanciation (si tu ne le fait pas tes options sont mise avec une valeur par défaut) via un tableau associatif te permettant de modifier plusieurs options d'un coup avec setOptions() ou alors via setOption() pour modifier une seule option... .. .

Code :
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
<?php
$ex1 = new maClass();
$ex1->display();

// ou 

$ex2 = new maClass('test',false);
$ex2->display();

// ou
$ex3 = new maClass('',true,5);

if($var)
      $ex3->setOption('param1','bonjour');
            else
                  $ex3->setOption('param1','au revoir');
                  
$ex3->display();

// ou encore
$option = array(
                  'param1' => 'hello',
                  'param2' => 10,
                  'param3' => true
            );

$ex4 = new maClass();
$ex4->setOptions($options);
$ex4->display();

?>
Après ça dépend de ta class de ce qu'elle est cencée faire et donc du type et du nombre de paramètre dont elle à besoin... .. .

@ tchaOo°
kankrelune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 13h38   #3
Membre confirmé
 
Développeur Web
Inscription : septembre 2006
Messages : 215
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2006
Messages : 215
Points : 246
Points : 246
Salut

moi perso, je cree une class Configuration avec une variable static config

exemple:
Code :
1
2
3
4
 
class Configuration {
    static public $config = array ( 'conf1' => array(), 'conf2' => array() );
}
ensuite avec la fonction __autoload() de php5 j'ai mes configurations partout dans mon projet. et je les appel de cette maniere

Code :
1
2
3
 
 
$param1 = Configuration::$config['conf1'];
sahid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 13h43   #4
Membre chevronné
 
Avatar de kankrelune
 
Inscription : décembre 2005
Messages : 766
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 766
Points : 745
Points : 745
Ouep très bonne idée mais dans le cadre d'un projet redistribuable ça te limite à php5 ce qui est pas top si la class n'utilise pas de possibilités spécifiques à php5... .. .

@ tchaOo°
kankrelune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 13h47   #5
Membre confirmé
 
Développeur Web
Inscription : septembre 2006
Messages : 215
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2006
Messages : 215
Points : 246
Points : 246
vivi c vrai,

mais bon à partir du moment où on veut faire de l'objet en php, ...on ce doit d'utiliser php5 quand meme.
sahid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 13h57   #6
Membre chevronné
 
Avatar de kankrelune
 
Inscription : décembre 2005
Messages : 766
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 766
Points : 745
Points : 745
Uhm... question de point de vue... portabilité Vs possibilité... tout dépend du projet... .. .

@ tchaOo°
kankrelune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 13h57   #7
Membre du Club
 
Inscription : septembre 2006
Messages : 69
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 69
Points : 58
Points : 58
Salut, et merci pour les réponses.

En fait, j'aime bien avoir un maximum de paramètres, surtout quand c'est du code redistribué. Si je comptais le garder pour moi, ce serait mon affaire. Mais dans mon cas présent, je souhaite que l'utilisateur puisse paramétrer un maximum de choses le plus simplement possible.
Actuellement, j'ai 9 propriétés paramétrables. Les autres ne sont utilisées que pour le fonctionnement du script.

En gros, je ne me vois pas passer les 9 valeurs en paramètres, d'autant que ça a vocation à augmenter.

Kankrelune, il y a un petit truc que je ne comprends pas bien dans ton exemple.
Tu fais mention d'un constructeur avec la méthode __construct(), qui, si je ne dis pas de bêtise, à été introduite dans php5. Et tu parles aussi d'une méthode maClass(), qui me semblait être la définition du constructeur en php4, laquelle est censée être encore compatible en php5...
Du coup, je ne vois pas l'intérêt de spécifier les deux, si ce n'est dans un soucis de compatibilité entre php 4 et 5 ? (mais je ne pige pas tous les rouages de ce mécanisme...).

En fait, ma classe sert à manipuler certains fichiers. Je souhaite, entre autres paramètres, spécifier quel fichier, le répertoire racine (du site), quelques noms de fichiers spécifiques, etc.
Je souhaite que certains fichiers soient lus dès l'instanciation de l'objet, et que leur contenu soit traité à ce moment là, histoire que l'objet soit utilisable en l'état. Bon, j'ai toujours la possibilité d'utiliser une méthode pour ça, qui serait appelée explicitement, mais ça me parait un peu lourd, comme je le disais, pour un simple utilisateur de ma classe. Encore une fois, si c'était pour un script perso, je ne me poserais pas la question...

Sahid, ce que tu me décris là, c'est ce que j'ai vu quelque part, dont je parlais dans mon premier message, et dont je disais que je n'avais pas bien compris comment ça marche... (ouais, je suis pas 100% débutant en POO php, mais pas loin). Si donc, tu voulais bien détailler un poil plus, je n'y serais pas opposé

Par ailleurs, comme le dit kankrelune, je préfère, dans le cas d'un projet redistribuable, ne pas me limiter à php5. D'ailleurs, je ne maitrise pas suffisament la POO en php pour être capable d'utiliser à fond les possibilités de php5. Pourquoi pas, plus tard, avoir deux versions, une pour php4 et une optimisée pour php5. Mais je n'en suis pas là encore.



Je continue de réfléchir
PseudoCoder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 14h10   #8
Membre chevronné
 
Avatar de kankrelune
 
Inscription : décembre 2005
Messages : 766
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 766
Points : 745
Points : 745
Citation:
Envoyé par PseudoCoder
Kankrelune, il y a un petit truc que je ne comprends pas bien dans ton exemple.
Tu fais mention d'un constructeur avec la méthode __construct(), qui, si je ne dis pas de bêtise, à été introduite dans php5. Et tu parles aussi d'une méthode maClass(), qui me semblait être la définition du constructeur en php4, laquelle est censée être encore compatible en php5...
Du coup, je ne vois pas l'intérêt de spécifier les deux, si ce n'est dans un soucis de compatibilité entre php 4 et 5 ? (mais je ne pige pas tous les rouages de ce mécanisme...).
En fait c'est très simple... cette technique permet l'émulation du destructeur de php5 en php4... quand j'instancie ma classe en php5 le parseur trouve une méthode __construct et l'éxécute "sans se poser de question"... s'il ne trouve pas __construct() il se rabattra sur maClass()... à la fin de l'éxécution de mon script le parseur execute __destruct() si celui ci existe... jusque là rien d'anormale... en php4 le parseur cherche directement maClass() car __construct() il ne connait pas je sais donc que si c'est maClass() qui est executée on est sous php4... ainsi tu remarquera un appel de register_shutdown_function() qui me permet d'enregistrer le destructeur comme fonction à exécuter à la fin du script... et hop le tour est joué ma class exécute son destructeur sous php4... ça peut être très pratique (comme inutile) surtout pour une classe comme la tienne qui manipule des fichiers (fermeture des pointeurs,etc..)... .. .

@ tchaOo°
kankrelune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 15h41   #9
Membre confirmé
 
Développeur Web
Inscription : septembre 2006
Messages : 215
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2006
Messages : 215
Points : 246
Points : 246
Citation:
Envoyé par PseudoCoder
Salut, et merci pour les réponses.
Sahid, ce que tu me décris là, c'est ce que j'ai vu quelque part, dont je parlais dans mon premier message, et dont je disais que je n'avais pas bien compris comment ça marche... (ouais, je suis pas 100% débutant en POO php, mais pas loin). Si donc, tu voulais bien détailler un poil plus, je n'y serais pas opposé
c quoi que tu n'as pas compris ??
sache quand meme que ca utilise des fonctionnalitées offerte seulement par PHP5
sahid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 16h02   #10
Membre du Club
 
Inscription : septembre 2006
Messages : 69
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 69
Points : 58
Points : 58
Ce que je n'ai pas compris... A peu près tout...
Ton exemple est à peu près clair, quoi que pas encore très parlant pour moi, mais je ne vois pas vraiment quels avantages je retire de cette technique.
En plus, j'ai un peu de mal avec l'utilisation de l'opérateur de résolution de portée : ça ne me parle pas vraiment et c'est un peu trop abstrait pour moi, encore...

Je ne doute pas que ça n'utilise pas des fonctionnalités propres à php5. J'insistais simplement sur le fait que j'ai besoin que ce soit 100% compatible php4 et 5
PseudoCoder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 17h18   #11
Membre confirmé
 
Développeur Web
Inscription : septembre 2006
Messages : 215
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2006
Messages : 215
Points : 246
Points : 246
l'accès à une variable statique ce fait très facilement, pas besoin de créer une instance de la class configuration, puis étant donner que les configurations ne change pas il n'est pas nécessaire de crée des copie de celle ci à chaque fois que tu en a besoin, ça alourdi le soft et diminue les perf, sans compter que tu y perd en clarté dans le code

tu as juste à faire MaClass::MaVarStatic
sahid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2006, 17h28   #12
Membre du Club
 
Inscription : septembre 2006
Messages : 69
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 69
Points : 58
Points : 58
Mais justement... Si je veux créer plusieurs instances d'une même classe, chacun ayant une configuration différente ?
L'exemple bête, dans mon cas, mes objets manipulent un fichier spécifique.
Plusieurs objets manipuleraient donc plusieurs fichiers de la même nature, mais situés dans des répertoires différents, faisant référence chacun à un fichier utilisateur différent, etc

Est-ce que l'utilisation d'une classe configuration serait, dans ce cas là, également intéressante ?

Pour l'instant, j'expérimente avec deux arguments passés lors de l'instanciation : le premier définissant le chemin d'un fichier, le second étant un tableau avec le reste de la configuration, laquelle, si elle n'est pas mentionnée, prend des valeurs par défaut. L'idée est que le second paramètre est optionnel, pas le premier.

Je ne sais pas si faire des tests de performances serait vraiment aisé à mettre en place ou pertinent. Je verrai plutôt ce qui est le plus ergonomique pour un utilisateur lambda.

Je ne fais qu'expérimenter, je reste ouvert à toute solution alternative
PseudoCoder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 13h00   #13
Membre chevronné
 
Avatar de kankrelune
 
Inscription : décembre 2005
Messages : 766
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 766
Points : 745
Points : 745
Pour les test de performance fais une recherche à XDebug... .. .

@ tchaOo°
kankrelune est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h31.


 
 
 
 
Partenaires

Hébergement Web