La classe
In permet de gérer facilement l'utilisation des données provenant des tableaux super-globaux
$_GET et
$_POST notamment.
Elle a vu le jour en 2007 et préfigurait le framework SALT. Elle a fait l'objet d'un article sur
Developpez.com en 2011 :
Formatage des données en PHP
Depuis, elle a été entierement réécrite et étendue. Depuis la version 2 de SALT, elle est liée aux mécanismes de conversions de SALT et n'est plus autonome.

Cette version de la classe In ne supporte
plus les magic_quotes_gpc. L'option étant supprimée à partir de PHP 5.4.0, on prend un peu d'avance (SALT fonctionnant en 5.3.0+)
Concepts
Cette classe est basée sur le concept que
la mise en forme d'une donnée doit être réalisée lors de l'affichage.
Lorsque ce n'est pas le cas et qu'on stocke une donnée mise en forme en base de données, l'affichage sera plus rapide parce que le
formatage n'aura pas besoin d'être réalisé à chaque affichage de page, mais vous devrez "dé-formater" la donnée si vous voulez
la modifier, ce qui est très souvent source de problèmes.
Dans le cas où la mise en forme est vraiment très lourde, on conseille de stocker la donnée deux fois : au format
brut (pour modification seulement) et au format transformé (pour affichage seulement).
Configuration
La classe a deux options de configuration :
- In::setCharset($charset) qui permet de définir le charset à utiliser dans les fonctions de conversions
(htmlentities par exemple)
Par défaut le charset est NULL, il utilisera donc celui du système, mais SALT le positionne à son charset par défaut qui
est UTF-8.
- In::setThrowException($boolean) qui permet de lever ou non une exception en cas d'accès à une variable inexistante
Par défaut, en cas de variable inexistante, une exception est levée. Dans le cas où on appelle setThrowException(FALSE),
l'accès à une variable inexistante renverra NULL, quelque soit le format demandé. Des exceptions pourront toujours
être levées pour d'autres raisons, comme une mauvaise utilisation de l'API.
Ces options sont globales, elles modifient les paramètres pour toutes les instances de
In déjà créées ou à créer.
La classe In supporte les formats suivants :
- HTML: Converti la variable pour un affichage dans une page HTML
- RAW: Renvoi la variable brute sans conversion
- URL: Converti la variable pour un affichage dans une URL
- B64: Converti la variable en base64. Utile pour l'envoi de mail par exemple
ainsi que les formats spéciaux suivants :
- ISSET: Vérifie qu'une variable est définie
- SET: Permet de modifier une variable
Types (sources) supportés
La classe In supporte les types suivants :
- G: Correspond au tableau $_GET
- P: Correspond au tableau $_POST
- F: Correspond au tableau $_FILES
- C: Correspond au tableau $_COOKIE
- S: Correspond au tableau $_SERVER
- R: Correspond au tableau $_REQUEST
- E: Correspond au tableau $_ENV
- SS: Correspond au tableau $_SESSION
Utilisation classique
Pour utiliser la classe In, il faut d'abord en récuperer le singleton avec :
<?php
$In = In::getInstance();
Puis on peut formater une variable avec la syntaxe :
$In->TYPE->FORMAT->variable
Par exemple, pour afficher le contenu d'une variable du tableau $_GET (TYPE=G) pour un affichage dans une page HTML (FORMAT = HTML) :
<?php
echo 'Vous avez entré la valeur suivante dans l\'URL : '.$In->G->HTML->user_name;
$In->G->HTML->user_name est équivalent à :
htmlentites($_GET['user_name'], ENT_QUOTES, CHARSET); et va
donc formater une entrée de l'utilisateur afin d'éviter que des balises HTML apparaissent sur la page et posent un problème d'affichage
ou de sécurité.
Utilisation sur variable locale
Toutes les données ne venant pas des tableaux super globaux, il est possible d'utiliser les fonctions de formatages définies dans
In sur une variable locale. Dans ce cas là on n'indique pas de type, mais directement le format souhaité en passant
la variable locale en paramètre.
<?php
$variable = 'toto <u>qui connait les balises HTML</u>';
echo 'La valeur de $variable est : '.$In->HTML($variable);
Cela va afficher
toto <u>qui connait les balises HTML</u>, sans permettre aux balises HTML
d'être interprétées.
Format ISSET
Le format
ISSET permet de vérifier qu'une variable est définie dans un tableau super global. Par exemple, on aura souvent :
<?php
if ($In->P->ISSET->submit) {
// récupération et traitement des données du formulaire en POST
}
Le format ISSET renverra toujours TRUE ou FALSE
Format SET
Le format SET permet de modifier une variable dans un tableau super global. Si ca a peu d'interêt pour $_GET et $_POST, ca en a
pour $_SESSION par exemple.
<?php
session_start();
$In->SS->SET->is_logged = TRUE;
Extension de la classe
Il est possible d'étendre la classe In afin de surcharger la méthode
register() et déclarer ses propres types et
ses propres formats.
Dans ce cas, il suffira d'appeler getInstance() sur la classe fille pour récupérer une instance contenant les nouveaux formats
<?php
class InExtended extends In {
protected function register() {
parent::register();
self::registerFormat('REV', REVConverter::getInstance());
}
}
class REVConverter extends AbstractConverter {
public function convert($value) {
return strrev($value);
}
}
$In = InExtended::getInstance();
echo $In->REV('azerty').'<br/>'; // affiche ytreza
$In->G->SET->author='fladnag';
echo $In->G->REV->author;
Fonctionnement interne et performance
La classe In a été concue pour être la plus performante possible.
Si on détaille un appel classique :
$In->G->HTML->user
- $In->G: Va renvoyer une nouvelle instance de la classe In liée au tableau $_GET
- $In->G->HTML: Va renvoyer une instance du converter HTML lié à l'instance In liée au tableau $_GET
- $In->G->HTML->user: Va renvoyer le retour de la méthode de conversion du converter HTML appliqué à la valeur de "user" dans le tableau $_GET
A chaque fois qu'on accède à une propriété de la classe In, le retour est mis en cache.
Si on réalise un 2ème appel avec
$In->G->URL->lien
- $In->G: L'instance liée au tableau $_GET existe déjà et est renvoyée directement
- $In->G->URL: Va renvoyer une instance du converter URL lié à l'instance In liée au tableau $_GET
- $In->G->URL->lien: Va renvoyer le retour de la méthode de conversion du converter URL appliqué à la valeur de "lien" dans le tableau $_GET
Si on réalise un 3ème appel avec à nouveau
$In->G->HTML->user, les valeurs seront renvoyées directement et
aucune méthode de la classe In ne sera appelée
Cela est possible grâce aux propriétés dynamiques des objets en PHP.
Lorsqu'on stocke le retour d'un getter en cache, on le stocke directement comme une nouvelle propriété dynamique de l'objet. Cela
permet d'avoir des temps d'accès très rapide ensuite à ces propriétés.
Cependant, lorsqu'on réalise un appel avec SET, cette mise en cache peut être problématique, et on est obligé de parcourir tout les
formats de l'instance pour supprimer du cache les anciennes valeurs.
Par exemple, si on a eu les accès suivants :
<?php
$In->G->HTML->a
$In->G->HTML->b
$In->G->URL->a
$In->G->RAW->c
$In->P->HTML->d
puis qu'on réalise :
<?php
$In->G->SET->a = 'autre valeur';
on va devoir parcourir tout les formats définis du type G pour invalider l'entrée "a" dans chaque instance.
Ici, on va :
- Invalider l'entrée "a" du format
G->HTML
- Invalider l'entrée "a" du format
G->URL
- Invalider l'entrée "a" du format
G->RAW : elle n'existe pas, mais il est plus rapide d'invalider
une propriété inexistante que de vérifier son existence
- Vérifier l'existence de
G->SQL: Le format n'a jamais été appelé, donc il n'existe pas et on ne fait rien
- Vérifier l'existence de
G->B64: Le format n'a jamais été appelé, donc il n'existe pas et on ne fait rien
On doit donc parcourir tout les formats déclarés.
Si on utilise beaucoup la classe In, l'appel à un SET peut être un peu long, mais ce temps supplémentaire reste limité au type
auquel il s'applique : si on défini 300 variables en cache dans
In->G-> et qu'on appelle
In->SS->SET, les 300 variables n'auront aucun impact.