7.100 Flôts
7 Index des fonctions
Manuel PHP
. Introduction . Filtres de flôts . Contextes de flôts . Installation . Classes Stream . Constantes prédefinies . Erreurs de flôts . Exemples . stream_context_create . stream_context_get_options . stream_context_set_option . stream_context_set_params . stream_copy_to_stream . stream_filter_append . stream_filter_prepend ->stream_filter_register . stream_get_filters . stream_get_line . stream_get_meta_data . stream_get_transports . stream_get_wrappers . stream_register_wrapper . stream_select . stream_set_blocking . stream_set_timeout . stream_set_write_buffer . stream_socket_accept . stream_socket_client . stream_socket_get_name . stream_socket_server . stream_wrapper_register
|
7.100.16 stream_filter_register()Enregistre un filtre de flôt[ Exemples avec stream_filter_register ] PHP 5 CVS only
bool
stream_filter_register (
string
filtername
,
string
classname
)
stream_filter_register
vous permet d'implémenter
votre propre filtre de flôt, à utiliser avec les fonctions d'accès
aux données externes (comme
fopen
,
fread
, etc...).
Pour ce faire, vous devez définir une classe qui étend la classe
php_user_fitler
avec les membres et méthodes définies
ci-dessous. Lorsque vous réalisez des opérations de lecture et d'écriture
dans le flôt auquel votre filtre est attaché,
PHP
passera les données
à travers votre filtre (et tous les autres filtres attachés), de façon
à ce que les données soient modifiées telles que désiré. Vous devez
implémenter les méthodes telles que décrit ci-dessous, sous peine de
comportement indéfini.
stream_filter_register
retourne
FALSE
si le nom
de filtre
filtername
est déjà utilisé.
int
filter (
resource
in
,
resource
out
,
int
&consumed
,
bool
closing
)
Cette méthode est appelé à chaque fois que des données sont lues ou écrites
dans le flôt attaché (avec des fonctions comme
fread
ou
fwrite
). Le paramètre
in
est une ressource
qui pointe sur une
bucket brigade
qui contient un ou plusieurs
objet
bucket
contenant les données à filtrer.
out
est une autre ressource
qui pointe sur une
bucket brigade
dans laquelle les donnée seront placées.
consumed
, qui doit
toujours
être déclaré par référence, doit être incrémenté de la taille de données que
votre filtre lit et modifie. Dans la plupart des cas, cela signifie que vous
devrez incrémenter
consumed
avec
$bucket->datalen
pour chaque
$bucket
.
Si le flôt est en cours de fermeture (et par conséquent, cela sera le dernier
passage dans la chaîne de filtres), le paramètre
closing
vaudra
TRUE
La méthode filter doit retourner l'une
des trois valeurs suivantes :
PSFS_PASS_ON
indique la réussite,
et les données sont dans le paramètre
out
, une
bucket brigade
.
PSFS_FEED_ME
indique que le filtre n'a aucune données à retourner, et
requiert d'autres données du flôt.
PSFS_ERR_FATAL
indique que le flôt a rencontré une erreur
fatale, et ne peut continuer. Si aucune valeur n'est retournée par cette méthode,
PSFS_ERR_FATAL
est utilisé.
void
oncreate (
void
)
Cette méthode est appelée durant l'instantiation du filtre. Si votre
filtre alloue ou initialise d'autres ressources (comme des
buffers), c'est le moment de le faire.
void
onclose (
void
)
Cette méthode est appelée durant l'extinction du filtre (généralement,
lorsque le flôt est fermé), et est exécuté
après
l'appel de la fonction
flush
. Si aucune ressource
a été allouée ou créée durant
oncreate()
,
c'est le moment de les libérer.
L'exemple ci-dessous implémente un filtre appelé
rot13
, sur le flôt
foo-bar.txt
,
qui réalise un chiffrement de type ROT-13 sur toutes les lettres
lue ou écrite dans le flôt.
| Filtre ROT13 pour les flôts |
<?php
/* Definition de notre classe de filtre */ class rot13_filter extends php_user_filter { function read($length) { $tempstr = parent::read($length); for($i = 0; $i < strlen($tempstr); $i++) if (($tempstr[$i] >= 'A' AND $tempstr[$i] <= 'M') OR ($tempstr[$i] >= 'a' AND $tempstr[$i] <= 'm')) $tempstr[$i] = chr(ord($tempstr[$i]) + 13); else if (($tempstr[$i] >= 'N' AND $tempstr[$i] <= 'Z') OR ($tempstr[$i] >= 'n' AND $tempstr[$i] <= 'z')) $tempstr[$i] = chr(ord($tempstr[$i]) - 13); &nb
if (($data[$i] >= 'A' AND $data[$i] <= 'M') OR ($data[$i] >= 'a' AND $data[$i] <= 'm')) $data[$i] = chr(ord($data[$i]) + 13); else if (($data[$i] >= 'N' AND $data[$i] <= 'Z') OR ($data[$i] >= 'n' AND $data[$i] <= 'z')) $data[$i] = chr(ord($data[$i]) - 13); return parent::write($data); } }
/* Enregistrement du filtre avec PHP */ stream_filter_register("rot13", "rot13_filter") or die("Impossible d'enregistrer le filtre");
$fp = fopen("foo-bar.txt", "w");
/* Liaison du filtre avec le flôt */ stream_filter_append($fp, "rot13"($fp);
/* Le filtre ne s'applique qu'au flôt $fp * ce qui fait que cette lecture se fait sans déchiffrement */ readfile("foo-bar.txt");
/* affichage * ------
Yvar1 Jbeq - 2 Rnfl Nf 123
*/ ?>
|
Voir aussi
stream_register_wrapper
,
stream_filter_prepend
et
stream_filter_append
|