C’est tout comme raynor a dit ^^ un copier/coller malheureux getVal ne doit pas etre static.
l’idée c’est que getvalue soit juste un raccourci pour Configuration::getInstance()->getVal(‹ clé ›) on peut donc directement faire Configuration::getValue(‹ clé ›)
[quote="_Raynor_1_1"]
[quote="guymage"]
Et en passant pour la méthode getValue(), [b]tu peux appeler directement getVal($val); Pas besoin de récupérer l'instance, tu es déjà dans l'objet[/b]. (et l'utilité de faire une méthode public qui appelle une autre méthode public avec le même paramètre :D )
[/quote]
Heu... il me semble que non : dans [i]getValue($val)[/i], vu que c'est une méthode statique, tu n'est pas dans l'objet (dans l'instance).
[/quote]
En effet, mais l’appel n’était pas non plus bon car il récupérait l’instance, c’était plutôt Configuration::getVal($val);
function config_get($value) {global $config; $config[$value];}
ou encore
class Config {
private static $config;
public static function get($var) {return self::$config[$var];}
public static function set($var, $value) {self::$config[$var] = $value;}
public static function isset($var) {return isset(self::$config[$var]);}
}
Pas besoin d’une instance (« singleton ») pour un truc uniquement statique et pas utilisé dans un contexte objet (implémentation d’interface, etc). Surtout en PHP.
Dans ce cas là, afin d’éviter de faire un tableau contenant toutes ses variables (ce qui est peut entrainer des tableaux multi-dimensionnels) plutôt utiliser ceci :
$Mavar1='DarKChAm';
class Variables
{
public static function Get($var){return $GLOBALS[$var];}
public static function Set($var, $value){$GLOBALS[$var]=$value;}
public static function is_set($var){return isset($GLOBALS[$var]);}
}
var_dump(Variables::Get('Mavar1')); // Retourne: string(8) "DarKChAm"
Variables::Set('Mavar1', $Mavar1.'2');
var_dump(Variables::Get('Mavar1')); // Retourne: string(9) "DarKChAm2"
var_dump(Variables::is_set('Mavar2')); // Retourne: bool(false)
Il y a biensur moyen de faire un code bien plus simple que ma classe Configuration je n’en doute pas une seconde, l’idée de faire une classe est de pouvoir se servir du constructeur pour recuperer la configuration a different endroit.
Si on veux stoqué la config en base de données, et donc stoqué egalement la configuration de l’acces a la BD dans un fichier, avec une classe Configuration il suffit pour cela d’appeller une fois getInstance() et l’objet s’occupe de recuperer les differente valeur, et de faire ce qu’il faut. L’avantage second est de pouvoir egalement changé le mode de stoquage en PHP. Passé d’un mode structuré simple (un tableau associatif a une dimension, vers un tableau associatif a plusieur dimension ou ,comme je disais plus haut, une structure semblable au ZendConfig).
Cette classe permet aussi si on l’ameliore un poil de gerer la modification des valeurs de configuration.
$GLOBALS = tableau des variables globales. Si tu tapes dedans, ça revient à faire global $$var; et surtout c’est inutile puisque dans le contexte global, tu y a déjà accès.
Get, Set = EN MINUSCULE. is_set : pas de « _ ». C’est une question de cohérence. J’ai mis get, set, isset, ce n’est pas pour rien. J’aurai pu chipotter et mettre isSet(), mais bref. Soit tu fous Get, Set, IsSet. get, set, isset, mais pas un mix.
TheGuit: je ne critique pas l’utilisation, mais l’implémentation.
Quel intérêt de créer un singleton (le pattern à problème par excellence, c’est un design pattern tellement simple que la plupart des gens s’en serve de manière irréfléchie) si celui-ci n’a pas de véritable rôle « objet » (et donc, n’hérite pas, n’implémente rien, …)?
Dans ce cas là, j’en vois aucun. Si ce n’est maintenir une instance d’un objet qui peut être remplacé par une classe purement statique.
Edité le 15/05/2008 à 12:56
Je suis d’accord, m’enfin moi mon problème à la base, c’est de rendre accessible toutes mes variables dans toutes mes méthodes sans devoir utiliser le mot-clé global au début de cette dernière. Ce que l’on fait ici ne fait que déplacer le problème car pour éviter un code redondant, on appelle les variables d’un méthode plus lourde que celle d’origine.
Moi je voulais éviter ça :
function methode()
{
global $Mavar;
// ... Appelles x fois de $Mavar
}
Et je me retrouve à utiliser ça :
function methode()
{
// ... Appelles x fois de Config::$Mavar, ou Config::Get('Mavar')
}
Au bout ça revient au même question redondance, et je préfère appliquer ma première façon. Ce qu’il me faudrait c’est accéder directement à ma variable par un appel du type « $Mavar ». J’arrive à rendre existent cet appel au sein d’une méthode, via la boucle suivante :
foreach(array_keys($GLOBALS) as $Key)
{$$Key=$GLOBALS[$Key];}
Mais je n’arrive pas à transmettre une variable définie dans une méthode dans une autre méthode directement. C’est à dire sans rajouter le mot clé-global ou utiliser l’instance de la classe.
Oui, je suis d’accord que « global $$var; return $$var; » = « return $GLOBALS[$var]; », et donc quitte a choisir je préfère la deuxième utilisation. Après si c’est inutile dans l’exemple que j’ai donné c’est parce que je montrais juste que ça marchais, mais bien entendu les appelles que je passeraient après seraient dans un contexte non-global, et donc, comme je le désire, au sein d’un méthode issue d’une quelconque classe.
Si je mets « isset » il me retourne une erreur.
Edité le 15/05/2008 à 13:37
J’ai édité, désolé j’avais pas compris au début. Pour ta deuxième remarque, peu importe la casse, isset me retourne toujours une erreur.
Et puis je m'excuse de souiller le topic par mon problème, je pensais pas qu'il prendrait tant d'ampleur donc j'avais pas jugé utile de lancer un topic.
Edité le 15/05/2008 à 13:41