SALT > Manuel > Tutoriel > Affichage >
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.

alert 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 : Ces options sont globales, elles modifient les paramètres pour toutes les instances de In déjà créées ou à créer.

Format supportés

La classe In supporte les formats suivants : ainsi que les formats spéciaux suivants :

Types (sources) supportés

La classe In supporte les types suivants :

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
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
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->'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 : 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.