Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Nous allons maintenant établir le rôle de chacune des méthodes dont nous aurons besoin et je vous fournirai le code PHP correspondant. Dans la dernière partie, je propose une organisation en héritage pour trier les méthodes par genre.
Voici d'abord nos variables :
$fichier,
$groupe,
$item,
$valeur,
$fichier_ini. Les 3 premières sont respectivement les noms du fichier, du groupe et de l'item,
$valeur est la valeur courante à la position donnée par les coordonnées et
$fichier_ini est l'array contenant tout le
.ini :
Code : PHP1
2
3
4
5
6
7
8 | <?php
class ini
{
var $fichier="";
var $groupe="";
var $item="";
var $valeur="";
var $fichier_ini=array();
|
m_fichier()
Cette méthode reçoit en paramètre l'adresse du fichier à lire et elle transforme le fichier en array qu'il stocke dans
$fichier_ini :
Code : PHP 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 | <?php
function m_fichier($arg)
{
$this->fichier=$arg;
$this->fichier_ini=null;
$this->fichier_ini=array();
// Pour utiliser parse_ini_file() par défaut, enlevez /* et */, sinon supprimez ce commentaire (conseillé)
/*if(false!==($array=@parse_ini_file($arg, TRUE)))
{
$this->fichier_ini=$array;
}
else*/if(file_exists($arg) && $fichier_lecture=file($arg))
{
foreach($fichier_lecture as $ligne)
{
if(preg_match("#^\[(.+)\]\s*$#",$ligne,$matches))
{
$groupe_curseur=$matches[1];
}
else
{
if($ligne[0]!=';' && $tableau=explode("=",$ligne,2))
{
$this->fichier_ini[$groupe_curseur][$tableau[0]]=preg_replace("#\s$#","",$tableau[1]);
}
}
}
}
$this->valeur=$this->fichier_ini[$this->groupe][$this->item];
}
?>
|
J'en profite pour vous parler de la fonction
parse_ini_file() qui fait cette opération que je vous conseille de ne pas utiliser, car elle ne récupère pas l'intégralité d'un item : s'il trouve le signe '=' dans une valeur, la fonction ne renverra que ce qu'il y a avant. Cela est rarement un avantage et si jamais vous vouliez uniquement récupérer ce qu'il y a avant le premier = d'une valeur, il y a un moyen simple de le faire :
Code : PHP1 | <?php $valeur_avant_egal=reset(explode("=",$valeur_initiale)); ?>
|
De plus la fonction
parse_ini_file() est à usage unique alors que la fonction
m_fichier (ci-dessus) est adaptable, c'est à dire que vous pouvez décidez que, chez vous, les commentaires commencent par
# et non par
; ou encore que votre array a un niveau de plus et donc que le fichier contient des sous-groupe délimités par
{groupe} ou
<groupe>. Et enfin dans certains cas, le type des données stockées peut être important. Alors des préfixes comme
i:,
f:,
s: peuvent indiquer si la valeur est un nombre entier, décimal ou une chaîne de caractères. Bref, le stockage d'un array dans un fichier ne se limite pas à la technique des fichiers
.ini, il n'a de limite que votre imagination.
m_groupe()
Pour sélectionner un groupe :
Code : PHP1
2
3
4
5
6
7
8 | <?php
function m_groupe($arg)
{
$this->groupe=$arg;
$this->valeur=$this->fichier_ini[$this->groupe][$this->item];
return true;
}
?>
|
m_item()
Pour sélectionner un item :
Code : PHP1
2
3
4
5
6
7
8 | <?php
function m_item($arg)
{
$this->item=$arg;
$this->valeur=$this->fichier_ini[$this->groupe][$this->item];
return true;
}
?>
|
m_put()
Pour changer une valeur. Avec 1 paramètre, la valeur est insérée dans l'item sélectionné et le groupe sélectionné. Les paramètres suivants sont optionnels : il s'agit dans l'ordre de l'item, du groupe et du fichier qui sont sélectionnés si les paramètres correspondants sont fournis :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11 | <?php
function m_put($arg, $arg_i=false, $arg_g=false, $arg_f=false)
{
if($arg_f!==false) $this->m_fichier($arg_f);
if($arg_g!==false) $this->m_groupe($arg_g);
if($arg_i!==false) $this->m_item($arg_i);
$this->fichier_ini[$this->groupe][$this->item]=$arg;
$this->valeur=$arg;
return $this->fichier." ==> [".$this->groupe."] ".$this->item."=".$this->valeur;
}
?>
|
m_count()
Si aucun paramètre n'est fourni,
m_count renvoie un array contenant à l'entrée 0 le nombre total d'éléments dans le fichier
.ini, à l'entrée 1 le nombre de groupes dans le fichier et à l'entrée 2 le nombre d'items.
Si un paramètre est fourni,
m_count renvoie le nombre d'items dans le groupe fourni en paramètre.
Code : PHP1
2
3
4
5
6
7
8
9 | <?php
function m_count($arg_gr=false)
{
if($arg_gr===false)
return array(1=>$gr_cou=count($this->fichier_ini), 0=>$itgr_cou=count($this->fichier_ini, COUNT_RECURSIVE), 2=>$itgr_cou-$gr_cou);
else
return count($this->fichier_ini[$arg_gr]);
}
?>
|
array_groupe()
Si un paramètre est fourni,
array_groupe renvoie un array associatif contenant les items du groupe fourni en paramètre :
Code : PHP1
2
3
4
5
6
7
8 | <?php
function array_groupe($arg_gr=false)
{
if($arg_gr===false)
$arg_gr=$this->groupe;
return $this->fichier_ini[$arg_gr];
}
?>
|
À noter : les deux lignes ci-dessous sont équivalentes :
Code : PHP1
2
3
4 | <?php
print_r($objet->array_groupe('mon groupe'));
print_r($objet->fichier_ini['mon groupe']);
?>
|
save()
C'est l'opération inverse de
m_fichier, cette fonction remplace le contenu du fichier par l'array en cours de traitement.
save() sauvegarde donc les modifications apportées à
1 fichier :
Code : PHP 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 | <?php
function save()
{
$fichier_save="";
foreach($this->fichier_ini as $key => $groupe_n)
{
$fichier_save.="
[".$key."]";
foreach($groupe_n as $key => $item_n)
{
$fichier_save.="
".$key."=".$item_n;
}
}
$fichier_save=substr($fichier_save, 1);
if(file_exists($this->fichier) && reset(explode('.',phpversion()))>=5)
{
if(false===file_put_contents($this->fichier, $fichier_save))
{
die("Impossible d'écrire dans ce fichier (mais le fichier existe).");
}
}
else
{
$fichier_ouv=fopen($this->fichier,"w+");
if(false===fwrite($fichier_ouv, $fichier_save))
{
die("Impossible d'écrire dans ce fichier (Le fichier n'existe pas).");
}
fclose($fichier_ouv);
}
return true;
}
?>
|
À noter : il faut utiliser cette fonction avant de changer de fichier pour enregistrer les modifications. Peut-être que certains d'entre vous se disent qu'il vaudrait mieux inclure cette fonction dans
m_put pour éviter de l'oublier et éviter des lignes de codes inutiles, mais il peut s'avérer utile (j'en ai eu besoin) de modifier l'objet sans modifier le fichier.
clear()
Réinitialise toutes les variables de l'objet et efface l'array
$fichier_ini.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11 | <?php
function clear()
{
$this->fichier="";
$this->groupe="";
$this->item="";
$this->valeur="";
$this->fichier_ini=null;
$this->fichier_ini=array();
}
?>
|
s_fichier()
Supprime le fichier en cours d'exécution s'il existe.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
function s_fichier()
{
$return=$this->fichier;
if(file_exists($this->fichier)) unlink($this->fichier);
$this->fichier="";
$this->valeur="";
return "fichier(".$return.") supprimé.";
}
?>
|
s_groupe()
Supprime le groupe sélectionné.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
function s_groupe()
{
$return=$this->groupe;
if(isset($this->fichier_ini[$this->groupe])) unset($this->fichier_ini[$this->groupe]);
$this->groupe="";
$this->valeur="";
return "groupe(".$return.") supprimé.";
}
?>
|
s_item()
Supprime l'item sélectionné.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
function s_item()
{
$return=$this->item;
if(isset($this->fichier_ini[$this->groupe][$this->item])) unset($this->fichier_ini[$this->groupe][$this->item]);
$this->item="";
$this->valeur="";
return "item(".$return.") supprimé.";
}
?>
|
print_curseur()
Affiche les coordonnées du curseur et la valeur courante.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
function print_curseur()
{
echo "Fichier : <b>".$this->fichier."</b><br />";
echo "Groupe : <b>".$this->groupe."</b><br />";
echo "Item : <b>".$this->item."</b><br />";
echo "Valeur : <b>".$this->valeur."</b><br />";
return true;
}
?>
|
print_dossier()
Seulement si $fichier contient l'adresse d'un dossier.
Pour fonctionner correctement, il vous faut les images suivantes :

Cette fonction ne reçoit aucun paramètre et affiche un arbre contenant au sommet l'adresse entrée dans la méthode
m_fichier() et en dessous, la liste des fichiers
.ini que contient ce dossier (utile surtout dans la page d'administration).
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | <?php
function print_dossier()
{
if(is_dir($this->fichier)) {
echo "<img src='dir.png' alt='Dossier' /><span style='position:relative; top:-10px;font-size:20px; font-weight:bold;'>".$this->fichier."</span><br />";
if($handle=opendir($this->fichier))
{
while(false!==($file=readdir($handle)))
{
if(substr($file, -4, 4)==".ini")
{
echo " <a href='?fichier=".$file."'><img src='iniicone.png' alt='Ini' style='border:none;' /></a> ".$file."<br />";
}
}
closedir($handle);
}
return true; }
else { echo "L'élément sélectionné n'est pas un dossier"; return false; }
}
?>
|
print_fichier()
Affiche un aperçu du fichier et surligne le groupe et l'item sélectionné.
Code : PHP 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
function print_fichier()
{
if(file_exists($this->fichier) && is_file($this->fichier) && $fichier_lecture=file($this->fichier))
{
foreach($fichier_lecture as $ligne)
{
$ligne=preg_replace("#\s$#","",$ligne);
if(preg_match("#^\[.+\]\s?$#",$ligne))
$groupe=false;
if(preg_match("#^\[".preg_quote($this->groupe, "#")."\]$#",$ligne))
{
$echo.= "<span style='background-color:aqua;'>".htmlspecialchars($ligne)."</span><br />";
$groupe=true;
}
elseif($groupe==true && preg_match("#^(".$this->item."=)#",$ligne))
$echo.= "<span style='background-color:yellow;'>".htmlspecialchars($ligne)."</span><br />";
elseif($groupe==true && $this->item==reset(explode("=",$ligne)))
$echo.= "<span style='background-color:yellow;'>".htmlspecialchars($ligne)."</span><br />";
else
$echo.= htmlspecialchars($ligne)."<br />";
}
echo $echo;
}
else
{
echo "Le fichier n'existe pas ou est incompatible";
}
$this->valeur=$this->fichier_ini[$this->groupe][$this->item];
return true;
}
?>
|
m_valeur()
Prend deux paramètres : le premier est l'item et le deuxième le groupe.
m_valeur() renvoie la valeur (sous forme d'une chaîne de caractères) qui se trouve à l'item donné du groupe donné dans le fichier en cours de traitement.
Code : PHP1
2
3
4
5
6 | <?php
function m_valeur($arg_item, $arg_groupe)
{
return $this->fichier_ini[$arg_groupe][$arg_item];
}
?>
|
On termine bien sûr par fermer la déclaration de
class avec
}.
Grâce au mot-clé
extends nous allons pouvoir créer plusieurs
class complémentaires. Je vous propose de faire ainsi : ne laissez dans la
class ini que les méthodes de lectures :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
class ini
{
var $fichier="";
var $groupe="";
var $item="";
var $valeur="";
var $fichier_ini=array();
function m_fichier( ...
function m_groupe( ...
function m_item( ...
function m_valeur( ...
function m_count( ...
}
?>
|
Voilà donc la
class utile pour lire un fichier
.ini, mettez ça dans un fichier que vous incluez avec
include() ou
require() dans votre fichier
.php. Puis dans un autre fichier, mettez les méthodes d'écriture :
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
class ini_e extends ini
{
function m_put( ...
function save( ...
function s_fichier( ...
function s_groupe( ...
function s_item( ...
}
?>
|
que vous n'inclurez dans vos pages que si vous avez besoin de modifier un fichier
.ini : vous appellerez alors
ini_e et non
ini pour créer votre objet. Vous pouvez enfin faire un extension de
ini_e avec les méthodes
print_ et celles qui restent. Ce qui permet de ne pas déclarer des méthodes dont on n'a pas besoin dans une page ou une autre.
La partie héritage, c'est du bonus : ça n'est ni vraiment essentiel pour le traitement INI, ni utile pour la suite du tuto.