[POO] Classe `Configuration` :: Conseillez moi / Deuxième - Plume - 02-05-2007
Bonsoir ^^
Après la classe InterfaceSQL, que j'ai mis à jour, c'est le tour de la fameuse classe Configuration.
Code PHP : <?php
class Configuration
{
/*
* CHARGEMENT
* ==================
* Retourne un tableau contenant les variables du fichier
* ==================
* (array) t_chargement((string)$c_fichier )
*/
function t_chargement($c_fichier)
{
if(!file_exists($c_fichier))
{
return FALSE;
}
else
{
$variables = get_defined_vars();
require($c_fichier);
$variables2 = get_defined_vars();
$variablesFichiers = array_diff_assoc($variables2, $variables);
unset($variablesFichiers['variables']);
return $variablesFichiers;
}
}
/*
* CHARGEMENT_INI
* ==================
* Retourne un tableau contenant les variables du fichier ini
* ==================
* (array) t_chargement_ini((string)$c_fichier)
*/
function t_chargement_ini($c_fichier)
{
if(!file_exists($c_fichier))
{
return FALSE;
}
return parse_ini_file($c_fichier, TRUE);
}
/*
* SAUVEGARDE
* ==============
* Enregistre un tableau associatif dans le fichier de config en écrasant
* ==============
* (bool) b_sauvegarde( (array)$t_variables, (string)$c_fichier )
*/
function b_sauvegarde($t_variables, $c_fichier)
{
$c_donnees = '';
if($fp = fopen($c_fichier, 'w+'))
{
foreach($t_variables as $cle => $valeur)
{
$c_donnees .= '$'.$cle.' = '.var_export($valeur, TRUE).";\r\n";
}
fputs($fp, "<?php\r\n# Fichier de configuration géré avec la classe\r\n\r\n\r\n".$c_donnees."\r\n\r\n?>");
fclose($fp);
return TRUE;
}
else
{
return FALSE;
}
}
/*
* SAUVEGARDE_INI
* ==============
* Enregistre un tableau associatif dans le fichier ini en écrasant
* ==============
* (bool) b_sauvegarde_ini( (array)$t_variables, (string)$c_fichier)
*/
function b_sauvegarde_ini($t_variables, $c_fichier)
{
$c_donnees = '';
if($fp = fopen($c_fichier, 'w+'))
{
foreach($t_variables as $cle => $valeur)
{
$c_donnees .= '['.$cle."]\r\n";
foreach($valeur as $cle2 => $valeur2)
{
$c_donnees .= $cle2.'='.$valeur2.";\r\n";
}
$donnees .= "\r\n\r\n";
}
fputs($fp,"; Fichier de configuration géré avec la classe\r\n\r\n\r\n".$c_donnees);
fclose($fp);
return TRUE;
}
else
{
return FALSE;
}
}
}
?>
Source & aide :: Winzou
Merci
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - naholyr - 03-05-2007
La notation hongroise (ou polonaise chéplu) j'aime bien pour les variables pourquoi pas, mais pour les noms de fonctions/méthodes je ne trouve pas ça très heureux... Ce sont des noms dont il faut se souvenir, et il est plus naturel de se souvenir du nom de la méthode selon ce qu'elle fait (méthode = action) que selon ce qu'elle renvoie. D'autant que ce qu'elle renvoie est souvent totalement évident.
De plus pour une chaine le préfixe "s_" me semble un meilleur choix que "c_". L'anglais reste la langue commune dans notre domaine.
Ensuite tu as essayé de regarder ce que renvoyait ton get_defined_vars() dans ta première méthode ? Comme tu ne déclares aucun accès global à une variable dans ta méthode, et que tu ne déclares aucune variable à part $c_fichier, je pense que son retour est totalement prévisible : [c_fichier,_POST,_GET,_COOKIE,_FILES,_REQUEST,etc...]. Mais bon utiliser cette fonction a au moins l'avantage de ne pas avoir à se poser la question J'imagine que tu as du te poser la question, tu as choisi la méthode la moins performante mais la plus sûre (insensible à l'ajout futur de superglobales) et la plus lisible.
D'une manière générale, c'est au niveau de la conception surtout que j'agirais différemment, parce que là le modèle objet est sous-exploité. Finalement ce n'est pas une classe, juste un «set de méthodes». On aurait pu aller beaucoup plus loin dans l'ergonomie avec par exemple un modèle de ce type :Code : bool chargementPHP ( string $fichier [, string $section] )
Charge les variables déclarés dans le script $fichier, et les place dans la section $section.
Si aucune section n'est définie, on place dans la section générale "".
bool chargementINI ( string $fichier )
Charge les variables déclarées dans le fichier $fichier, et les place dans les sections définies.
bool sauverPHP ( string $fichier )
Sauvegarde les variables dans un fichier de déclarations de variables $fichier.
bool sauverINI ( string $fichier )
Sauvegarde les variables dans un fichier de configuration ini $fichier.
mixed getVar ( string $variable [, string $section ] )
Récupère la valeur de la variable $variable, dans la section $section.
Si $section est indéfini, on cherche dans la section générale "".
array getVars ( [ string $section ] )
Récupère toutes les variables de la section $section, sous forme de tableau associatif [nom] => valeur.
Si $section est indéfini, on cherche dans la section générale "".
bool setVar ( string $variable , mixed $valeur [, string $section ] )
Définit la variable $variable à la valeur $valeur, dans la section $section.
Si $section est indéfini, on cherche dans la section générale "".
bool setVars ( array $variables [, string $section ] )
Définit des variables dans la section $section, sous forme de tableau associatif [nom] => valeur.
Si $section est indéfini, on cherche dans la section générale "".
bool unsetVar ( $variable [, $section ] )
Supprime la variable $variable, dans la section $section.
Si $section est indéfini, on cherche dans la section générale "".
bool unsetVars ( [ $section ] )
Supprime toutes les variables de la section $section, et supprime la section.
Si $section est indéfini, on cherche dans la section générale "".
bool unsetAll ( )
Supprime toutes les variables et les sections.
void __construct ( )
Construit un nouvel objet Configuration vide.
static Configuration instance ( )
Renvoie une instance statique de Configuration, utile pour travailler sur un système de configuration globale à l'application sans avoir à travailler avec une variable globale.
Au passage, la méthode instance() étant un cas d'école, voici comment elle fonctionne (pour ceux que ça intéresse, voire toi si tu ne le savais pas déjà)Code PHP : <?php
class Configuration
{
...
function instance ()
{
static $instance = null;
if ($instance === null) {
$instance = new Configuration();
}
return $instance;
}
...
}
Tu pourras appeler 26 fois Configuration::instance(), elle te renverra toujours le même objet
Ce genre de méthode est extrèmement utile pour des classes dont les instances sont utilisées tout au long de l'application : BDD, Config, Session, sont les premiers qui viennent à l'esprit
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - Plume - 03-05-2007
Bonjour ^^
Merci de ta participation !
On dirait un peu genre 'pattern singleton' ce que tu fais avec la méthode instance.
Effectivement, ma 'classe' s'apparente plus à un set de méthode
En fait j'avais bien pensé à des méthodes pour par exemple récupérer la valeur d'une option particulière comme la méthode "mixed getVar ( string $variable [, string $section ] )", et quelques autres, mais finalement n'ayant pas la prétention de faire partager mes maigres connaissances, je me suis contenté de ce dont j'avais besoin Et je n'ai pas encore rencontré de cas où je n'avais besoin que d'une seule option, donc Hop! Tir de groupe ^^
En ce qui concerne le typage des fonctions, j'étais pas pour, mais on nous bassine tellement avec ces histoires de typages & autres, que je me suis dit que ça me couterait rien de le faire. Cependant, ça va être avec plaisir que je vais changer ça J'ai pas encore bien l'habitude des typages. D'ailleurs, je viens de me rendre compte que dans ma première méthode, j'ai encore oublié de typer les variables -_-
Pour finir, je reprendrais ce que tu as dit sur l'utilisation de get_defined_vars(). En fait, le premier appel est issu plus d'un conseil que d'une initiative personnelle ^^ Mais pour le raisonnement, c'est effectivement la seule justification que j'ai à fournir, donc rien à redire
Quand j'aurais bien avancé dans mes autres travaux, je verrais pour approfondir l'exploitation de l'objet
Merci !
@ tchaOo°
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - naholyr - 03-05-2007
:main:
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - Plume - 04-05-2007
Bonsoir ^^
Arrète ! J'ai typé mes variables, et ça marchait pas avec 1&1 !! J'suis fou, retour à 'var $variable' >.<
J'suis content que tu sois passé Ca va t'as pas dit grand chose ^^
@ tchaOo°
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - Plume - 04-05-2007
Heu ... Peut-être seulement .. J'voudrais bien comprendre qu'est-ce qu'est censée faire une classe qui gère des modules ... ^^ Ca risque de m'intéresser. Je développe un site avec des modules, sauf que c'est pas clair dans ma tête encore .. J'ai un peu peur de patauger.
@ tchaOo° mon grand ^^
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - naholyr - 05-05-2007
Ça parait assez confus ton truc
Quant au typage en PHP5, cela ne fonctionne que pour les classes. Imaginons qu'on ait écrit une classe Voiture, et une fonction clonerVoitures qui renvoie un tableau de X clones de la voiture :Code PHP : <?php
function clonerVoitures( Voiture $voiture , int $nbClones )
// ERREUR ! On ne peut pas typer un entier
clonerVoiture( Voiture $voiture , $nbClones )
// OK
Idem pour les attributs dans une classe. Comme c'est très limité, je préfère ne pas utiliser du tout cette fonctionnalité, et plutôt vérifier le type à la volée au début des fonctions. Pour ce faire je m'étais fait une classe de typage. Les noms des méthodes parlent d'eux-même, chaque fonction check* vérifie le type du paramètre à tester, et lève une exception en cas d'erreur.
Je vous la donne ça peut toujours servir :Code PHP : <?php
class TypeException extends Exception
{
}
class Typage
{
function raiseException($expectedType, $foundType = null)
{
$message = "Type error : $expectedType expected";
if ($foundType) {
$message .= ", but $foundType found";
}
throw new TypeException($message);
}
function check($type, $var, $nullAllowed = false)
{
if ($nullAllowed && $var === null) {
return true;
}
$type = strtolower($type);
if (substr($type,0,5) == 'class') {
Typage::checkObject($object, $nullAllowed);
if ( ! ($object instanceof $className) ) {
Typage::raiseException("Class:$class", "Class:".get_class($obj));
}
}
else {
$function = "is_$type";
if (function_exists($function)) {
if (!$function($var)) {
Typage::raiseException($type, gettype($var));
}
}
}
return true;
}
function checkInt($var, $nullAllowed = false)
{
return Typage::check('int', $var, $nullAllowed);
}
function checkFloat($var, $nullAllowed = false)
{
return Typage::check('float', $var, $nullAllowed);
}
function checkNumeric($var, $nullAllowed = false)
{
return Typage::check('numeric', $var, $nullAllowed);
}
function checkString($var, $nullAllowed = false)
{
return Typage::check('string', $var, $nullAllowed);
}
function checkBool($var, $nullAllowed = false)
{
return Typage::check('bool', $var, $nullAllowed);
}
function checkResource($var, $nullAllowed = false)
{
return Typage::check('resource', $var, $nullAllowed);
}
function checkCallable($var, $nullAllowed = false)
{
return Typage::check('callable', $var, $nullAllowed);
}
function checkObject($var, $nullAllowed = false)
{
return Typage::check('object', $var, $nullAllowed);
}
function checkClass($className, $object, $nullAllowed = false)
{
return Typage::check("class:$className", $object, $nullAllowed);
}
function checkArray($var, $nullAllowed = false)
{
return Typage::check('array', $var, $nullAllowed);
}
function checkArrayOf($elementsType, $array, $nullAllowed = false)
{
foreach ($array as $element) {
try {
Typage::check($elementType, $element);
}
catch (TypeException $e) {
Typage::raiseException("ArrayOf:$elementType");
}
}
return true;
}
function checkArrayOfClass($className, $array, $nullAllowed = false)
{
checkArrayOf("class:$className", $array, $nullAllowed);
return true;
}
}
Par exemple si une fonction doit prendre un booléen en paramètres :
Typage::checkBool($param);
Et si ce paramètre peut aussi être null :
Typage::checkBool($param, OR_NULL);
On peut aussi vérifier qu'on a en paramètre un tableau d'objets de la classe Bidule (ou héritées) :
Typage::checkArrayOfClass(Bidule, $param);
Code PHP : <?php
/** test **/
function multiplierChaine($str, $nb)
{
// vérification des types
Typage::checkString($str);
Typage::checkInt($nb);
// corps de la fonction
return str_repeat($str, $nb);
}
class A
{
}
class AA extends A
{
}
class B
{
}
$aa = new AA;
$b = new B;
Typage::check('class:a', $aa);
Typage::checkClass('B', $b);
try {
// le deuxième argument devrait être un entier
multiplierChaine('truc', 'bidule');
}
catch(TypeException $e) {
echo "Erreur dans les arguments";
}
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - naholyr - 06-05-2007
Teclis01 a écrit :Pour la classe Typage qui est je trouve fort sympatique :
Je ne vois qu'une seule méthode public les autres étant des private... Ce n'est pas vraiment une classe, juste un "set de fonctions". L'utilisation d'une classe ici n'est que pour palier à l'absence des namespaces en PHP. Toutes les méthodes sont publiques et statiques.
RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - Plume - 06-05-2007
Ouhla !!
J'regarderais tout ça quand j'aurais un peu de temps ^^
@ tchaOo°
|