Tiens voici une classe que j'ai ecrite la semaine derniere elle est compatible avec phpdocumentor
<?php
/** Classe finale de compteurs de visite a partir d'un fichier texte
* @package : Class
* @subpackage : CompteurDeVisite
* @category : Tools and Utilities
* @author : COLLARD charlie ([email protected])
* @created : 13/08/2009
* @version : 1
* @copyright 2009
****************************************************************************************************************
* @example Utilisation en php 4, supprimer tous les attributs public et private devant toutes les methodes de la classe
* $oCompteurVisite= new MyCompteurVisiteImplements (); ou $oCompteurVisite= new MyCompteurVisiteImplements ('toto.txt');
* if (is_object($oCompteurVisite)){
* $sMessageAAfficher=$oCompteurVisite->mAfficheNbreVisiteur();
* echo $sMessageAAfficher;
* }
* @example Utilisation en php 5, il faut appeler la methode publique tel que :
* $oCompteurVisite= new CompteurVisiteImplements (); ou $oCompteurVisite= new MyCompteurVisiteImplements ('toto.txt');
* if ($oCompteurVisite instanceof CompteurVisiteImplements AND is_object($oCompteurVisite)===TRUE){
* echo $oCompteurVisite->mAfficheNbreVisiteur();
* }
* echo $oCompteurVisite->mAfficheNbreVisiteur(); //aucune message erreur grace à la methode magique de php 5 __tostring()
************************************************************************************************à****************
* @contenu Exemple affichage du fichier texte encodé avec serialize:
*a:4:{s:8:"Requetes";i:9;
* s:7:"Visites";i:1;
* s:13:"DateConnexion";s:14:"20090813140235";
* s:9:"AdresseIp";s:9:"127.0.0.1";}
*
* @contenu Exemple affichage : voir # 1 Requetes 8 Visites 1 DateConnexion 20090813140235 AdresseIp 127.0.0.1
*****************************************************************************************************************
* @todo gestion des erreurs par une classe exception
**/
/** prototypage des methodes publiques
* les methodes privées ne doivents jamais apparaitre et sont en commentaires
**/
define ('REQUETES','Requetes');
define ('VISITES','Visites');
define ('DATECONNEXION','DateConnexion');
define ('ADRESSEIP','AdresseIp');
interface CompteurVisite
{
//private function mAfficheInfoDuFichier ();
//private function mAfficheInfoDuFichier ();
//private function mEnregistreInfoDansFichier ();
//private function mTraitementInfo () ;
public function mAfficheNbreVisiteur();
}
final Class CompteurVisiteImplements implements CompteurVisite{
//ne marche toujours pas
//const _REQUETTES_ = 'Requetes';
//const _VISITES_ = 'Visites';
//const _DATECONNEXION_ = 'DateConnexion';
//const _ADRESSEIP_ = 'AdresseIp';
private $sFichier='FichierStockageCompteurVisite.txt'; /**@access private
*@var string Nom par defaut du fichier texte de sauvegarde du nbre de visiteurs etc, si jamais aucun nom de fichier n'est passé au constructeur**/
private $iIp; /**@access private
*@var integer adresse ip du visiteur en cours**/
private $iTime; /** @access private
* @var integer date de la connexion du visiteur en cours**/
private $aDonneesDuFichier; /** @access private
* @var array variable de type tableau ou sont stockées les informations du compteur de visite **/
/** il faudra penser à utiliser des constantes par la suite pour les clefs du tableau car leurs valeurs ne bouge pas **/
/** intuile depuis les define si suppression des define utiliserdans le code les $this->sRequetes ,etc pour les trois autres
//private $sRequetes = 'Requetes'; /** @access private
/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/
//private $sVisite= 'Visites'; /** @access private
/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/
//private $sDateConnexion='DateConnexion'; /** @access private
/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/
//private $sAdresseIp='AdresseIp'; /** @access private
/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/
private $iNbreVisiteurAujourdhui; /** @access private
* @var integer variable de stovkage du nombre de visiteur connecté le jour meme **/
private $iNbreVisiteurTotal; /** @access private
* @var integer variable de stockage du nombre de visiteur total du site ; **/
private $iNbrePagesVisitees; /** @access private
* @var integer variable de stockage du nombre de pages total visitées **/
//private $aNomMethodeAInvoquer=array ( "mAfficheInfoDuFichier","mTraitementInfo","mEnregistreInfoDansFichier");
/** Constructeur de la classe
* à renommer en function CompteurVisite pour php 4
* @access public
* @param string $sFichierInfo le nom du fichier de sauvegarde des informations (facultatif)
* @return void ou null
**/
public function __construct ($sFichierInfo=NULL)
{
$this->iIp = $_SERVER['REMOTE_ADDR']; /**On recupere l'adresse ip en utilisant la variable superglobale £_SERVER ... **/
$this->iTime = date('YmdGis'); /**On recupere la date actuel au format 2009(année) 08(mois) 06(jour)17 (heure) 34 (min) 34 (secondes) **/
if( $sFichierInfo != NULL AND is_string($sFichierInfo)===TRUE ){ /**Si un parametre est passé au constructeur et que celui-ci est bien une chaine de caracetere **/
$this->sFichier=$sFichierInfo; /** on ecrase le nom de fichier d'enregsitrement par defaut defini au debut de la classe **/
}
/* Si le fichier où l'on stocke les données n'existe pas encore,on le crée.*/
if( file_exists($this->sFichier) === FALSE ) { /** <=> à ancienne version !file_exists($this->sFichier) **/
$fp = fopen($this->sFichier, "w");
/** on ecrit un tableau vide afin que la premiere lecture de celui-ci ne nous crée pas des messages d'alertes type "Notice: Undefined index: AdresseIp" en nous disant que les clefs du tableau n'existe pas voir test #2 #3 #4 #5 **/
fwrite($fp, serialize(array('REQUETES'=>'', /**clef Requetes (page visitees) independante de l'ip et de la date de connexion **/
'VISITES'=>'', /** clef **/
'DATECONNEXION'=>'',
'ADRESSEIP'=>''
)
)
);
fclose($fp); /** on ferme le fichier en lui precisant le pointeur de fichier **/
unset($fp); /** on libere les ressources pour une variable desomrais inutile **/
}
}
/** methode privée mAfficheInfoDuFichier ()
* permet de recuperer les informations issus du fichier
* @access private
* @param void ou null
* @return void ou null
**/
private function mAfficheInfoDuFichier ()
{
static $aNbreDeLignesDuFichier; /** variable de type static donc utilisable dans cette fontion uniquement **/
$aNbreDeLignesDuFichier = file($this->sFichier);
$this->aDonneesDuFichier = unserialize($aNbreDeLignesDuFichier[0]);
unset ($aNbreDeLignesDuFichier); /** on libere les ressources pour une variable desomrais inutile **/
}
/** methode privée mEnregistreInfoDansFichier ()
* On stocke le tableau dans le fichier de données
* en écrasant sa valeur précédente.
* @access private
* @param void ou null
* @return void ou null
**/
private function mEnregistreInfoDansFichier ()
{
$fp = fopen($this->sFichier,"w");
fwrite($fp, serialize($this->aDonneesDuFichier));
fclose($fp);
unset($fp); /** on libere les ressources pour une variable desomrais inutile **/
}
/** methode privée mTraitementInfo ()
* @access private
* @param void ou null
* @return void ou null
*/
private function mTraitementInfo ()
{
if (is_array($this->aDonneesDuFichier)===TRUE){ /** on verifie que nous sommes bien en presence d'un tableau avant de le parcourir afin d'eviter une erreur **/
foreach( $this->aDonneesDuFichier as $cle => $valeur ) /** on parcourt le tableau à deux dimensions **/
{
//echo $cle.' '.$valeur.'<br/>'; #1 pour le debug
/** explication succinte, si la date de connexion actuelle est postérieur à celle contenue dans le fichier, c'est que nous sommes potentiollement en face d'un nouveau visiteur
* pour eviter d'ajouter un nouveau visiteur qui serait le meme que le precedent , il suffit de tester son adresse ip
**/
if( substr($valeur, 0, 8) != substr($this->iTime, 0, 8) && $cle == "DATECONNEXION") { #2/**on verifie si la date de connexion contenue dans le fichier est antérieur à celle du visiteur **/
if( $this->aDonneesDuFichier["ADRESSEIP"] != $this->iIp) { #3 /** Si l'ip du fichier est differente de celle du visiteur , c'est que nous sommes en presence d'un nouveau visiteur**/
$this->aDonneesDuFichier["VISITES"]++; #4 /** on incrémente la valeur du nombre de visites**/
$this->aDonneesDuFichier["DATECONNEXION"]= $this->iTime; /** on enregistre la valeur de la connexion actuelle au sein de la clef DateConnexion du tableau **/
//ligne inutile car on va tout simplement ecraser la valeur par une nouvelle lors de la ligne de code suivanteunset($this->aDonneesDuFichier[$this->sAdresseIp]); /** on supprime l'ip du visiteur au sein du tableau **/
$this->aDonneesDuFichier["ADRESSEIP"] = $this->iIp; /** on enregistre la valeur de l'ip actuelle au sein de la clef AdresseIp de notre tableau **/
}
}
}
}
$this->aDonneesDuFichier["REQUETES"]++; #5 /** On incrémente ( ajoute +1 ) la valeur du nombre de requetes (nbre de pages visitées ).**/
/** On effectue un petit report de variable en vue de leur affichage **/
$this->iNbreVisiteurTotal= $this->aDonneesDuFichier["VISITES"];
$this->iNbreVisiteurAujourdhui = count($this->aDonneesDuFichier)-3; /** le nombre de visiteurs = **/
$this->iNbrePagesVisitees = $this->aDonneesDuFichier["REQUETES"];
}
/** methode publique (string) mAfficheNbreVisiteur ()
* donc accessible à l'exterieur de la classe qui permet d'afficher le nombres de visiteurs depuis la création du site
* et le nombre de visiteur de la journée
*@access public
*@param void ou null
*@return string qui correpond au message à afficher => on passera par l'emploi de la methode magique php5 __tostring pour l'afficher
**/
public function mAfficheNbreVisiteur()
{
static $sMessageAffiche='';
/** if (is_array($this->aNomMethodeAInvoquer)===TRUE){
foreach ($aNomMethodeAInvoquer as $sValue){ /** on parcourt un tableau à une dimension donc nous n'avons pas besoin des clefs pour acceder aux valeurs
$fonction='$this->'.$sValue.'()';
echo $fonction;
}else{
echo 'la classe '.$sValue.' est manquante ou inacessible)';
}
}//fin du foreach de parcours du tableau
unset ($this->aNomMethodeAInvoquer);
}//fin du if de test**/
$this->mAfficheInfoDuFichier ();
$this->mTraitementInfo ();
$this->mEnregistreInfoDansFichier ();
$sMessageAffiche.='Vous êtes le '.$this->iNbreVisiteurAujourdhui.' visiteur(s) aujourd\'hui sur un total de '.$this->iNbreVisiteurTotal.'.'; /** possiblite d'afficher également le nombre de pages chargées en utilisant la variable $this->iNbrePagesVisitees**/
return (string) $sMessageAffiche;
unset ($sMessageAffiche); /** on libere les ressources désormais inutile **/ /** on libere les ressources pour une variable desomrais inutile **/
}
/**La méthode magique __toString() est simple à utiliser et permet d'afficher un objet en faisant juste un echo d'une variable qui contient cet objet.
*@exemple echo $oCompteurVisite->mAfficheNbreVisiteur();
*@access public
*@param void ou null
*@return void ou null
**/
public function __tostring(){}
/** Destructeur de la classe
*@access public
*@param void ou null
*@return void ou null
**/
public function __destruct(){}
}
?>
pour l'utiliser :
juste :
$oCompteurVisite= new CompteurVisiteImplements ();
if ($oCompteurVisite instanceof CompteurVisiteImplements AND is_object($oCompteurVisite)===TRUE){
echo $oCompteurVisite->mAfficheNbreVisiteur();
}
seul bemol je voulais utiliser des constantes tel que
CONST REQUETES='Requetes';
mais je n'ai jamais reussit je suis donc resté avec mes trois variables , je suis decue ..si tu pouvais trouver la solution ce serait bien