JeuWeb - Crée ton jeu par navigateur
[POO] Classe `Configuration` :: Conseillez moi / Deuxième - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [POO] Classe `Configuration` :: Conseillez moi / Deuxième (/showthread.php?tid=1146)



[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 Smile



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 Wink 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 Wink
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 Wink


RE: [POO] Classe `Configuration` :: Conseillez moi / Deuxième - Plume - 03-05-2007

Bonjour ^^

Merci de ta participation ! Big Grin

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 Smile
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 Smile 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 Tongue 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 Smile

Quand j'aurais bien avancé dans mes autres travaux, je verrais pour approfondir l'exploitation de l'objet Wink

Merci ! Smile

@ 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é Big Grin 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 Confused

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°