Title: Fonctions
1Fonctions
2Fonctions
- function nom_fonction(param_1 val_déf, ...,
param_N val_déf) - //paramètres facultatifs, valeur par défaut des
paramètres facultative -
- instructions...
- return valeurs... //facultatif
-
- resultat nom_fonction(arg_1, ..., arg_N)
3Exemple
lt?php function formaterDate(jour, mois, an)
// renvoie un string jour/mois/an avec jour et
mois sur 2 chiffres if (jourlt10) res
'0'.jour.'/' else res jour.'/' if
(moislt10) res res.'0'.mois.'/' else
res res.mois.'/' return res.an echo
'date formateacutee '.formaterDate(3, 5,
2008) ?gt
Exécution date formatée 03/05/2008
4Fonctions dans un fichier externe
- require 'fichier' ou include 'fichier'
- include inclut et exécute un fichier PHP. sous
réserve que le fichier soit accessible via
l'include_path de la configuration d'Apache. En
cas d'erreur, include produit des warnings. - require fonctionne de la même façon sauf en cas
d'erreur il provoque une erreur fatale (arrêt
du script)
lt?php require 'mesfonctions.php' echo
formaterDate(3, 5, 2008) ?gt
5Paramètres par défaut
lt?php function formaterDate(jour, mois,
annee2008) if (jourlt10) res
'0'.jour.'/' else res jour.'/' if
(moislt10) res res.'0'.mois.'/' else res
res.mois.'/' return res.an ?gt
On peut appeler cette fonction avec 2 ou 3
paramètres echo formaterDate(3, 5, 2008)
renvoie la chaîne 03/05/2008 echo formaterDate(3,
5) renvoie la chaîne 03/05/2008
6Passage de paramètres par référence
- Dans le cas d'un passage d'argument par valeur
(arg), la variable contenant cette valeur dans
le programme appelant ne sera pas affectée par
des opérations dans la fonction. Il est possible
de passer des arguments par référence (arg).
Cela entraîne la possibilité de modification des
variables du programme appelant impliquées par la
fonction.
// Passage d'arguments par référence function
incrementation(inc) inc 100 i
0 echo 'i ' . i affiche 0 incrementation(
i) echo 'i ' . i affiche 100
incrementation(i) echo 'i ' . i affiche
200
7Fonction à liste d'arguments variable
- func_get_args() retourne un tableau contenant les
arguments transmis à la fonction
lt?php function somme() som 0 args
func_get_args() nbr count(args) for (i0
iltnbr i) som argsi return
som echo somme(1,2,3)."ltbrgt" echo
somme(1,2,3,4)."ltbrgt" echo somme()."ltbrgt" ?gt
Exécution 6 10 0
8Fonction à résultat multiple
lt?php function divisionEntiere(entier,
diviseur) // renvoie un array avec le quotient
puis le reste quotient (int)(entier /
diviseur) reste entier - diviseur
quotient return array(quotient,
reste) entier15 diviseur6 tab
divisionEntiere(entier, diviseur) echo
entier.' '.diviseur.' '.tab0.'
'.tab1 ?gt
Exécution 15 6 2 3
Remarque on peut récupérer le quotient et le
reste dans des variables en utilisant list() qui
transforme une liste de variables en tableau
list(quotient, reste) divisionEntiere(enti
er, diviseur) echo entier.' '.diviseur.'
'.quotient .' '.reste
9Portée des variables
- La visibilité est différente du langage C !
- En C, une variable déclarée dans un fichier hors
du corps d'une fonction (y-compris du main) est
accessible en tout point du fichier (sauf si une
fonction déclare une variable locale du même
nom). - En C, une variable déclarée dans un bloc (par
exemple dans une fonction) n'est accessible que
jusqu'à le fin de ce bloc. - En PHP, une variable définie hors d'une fonction
n'est pas accessible depuis le corps des
fonctions. - En PHP, si premier_script contient ...var ...
include autre_script.php - la variable var est visible dans autre_script et
les variables de autre_script sont visibles dans
premier_script (même chose pour require), mais
pas dans les fonctions.
10Exemple
lt?php a1 function fonc(param) b4 echo 'j
ai reçu le param '.param."ltbrgt"
param echo 'param '.param."ltbrgt" echo
'a '.a. 'donc non visible!'."ltbrgt" echo
'avant appel, a '.a."ltbrgt" fonc(a) echo
'après appel, a '.a."ltbrgt" ?gt
Exécution avant appel, a 1 j'ai reçu le
param 1 param 2 a donc non visible ! après
appel, a 1
11Variables globales
- global
- global var1,var2, .... définit les variables
de portée globale visibles dans les corps de
fonctions - une autre façon d'y accéder est d'utiliser le
tableau superglobal GLOBALS ainsi
GLOBALS"var1" - il existe des variables superglobales
(prédéfinies) accessibles dans tous les scripts
SERVER, GET, détaillées plus loin.
12Exemple
lt?php a1 1 a4 4 function
fonc(param) global a1 a1 echo 'dans fonc
a1 '.a1.' visibleltbrgt' echo 'dans fonc
a4 '.a4.' non visibleltbrgt' echo 'avant
appel de fonc a1 '.a1.' visibleltbrgt' echo
'avant appel de fonc a4 '.a4.'
visibleltbrgt' echo 'appel fonc(a4)ltbrgt' fonc(a
4) echo 'apres appel de fonc a1 '.a1.'
visibleltbrgt' echo 'apres appel de fonc a4
'.a4.' visibleltbrgt' ?gt
Exécution avant appel de fonc a1 1
visibleavant appel de fonc a4 4
visibleappel fonc(a4)dans fonc a1 2
visibledans fonc a4 non visible apres appel
de fonc a1 2 visibleapres appel de fonc
a4 4 visible
13Tableaux
14Tableaux array
- Il n'est pas nécessaire de déclarer la taille
d'un tableau. - L'indice du premier élément d'un tableau est 0.
Exécution ind 0 elt bonjour ind 1 elt 3 ind
2 elt tout ind 3 elt -5.4 ind 4 elt
monde nombre elements 5 ind 0 elt bonjour ind
1 elt 3 ind 2 elt tout ind 3 elt -5.4 ind 4
elt monde ind 5 elt le 6-ieme ind 6 elt
encore
lt?php tab array("bonjour", 3, " tout", -5.4, "
monde") //on déclare et on remplit le tableau
tab for (i0 i lt count(tab) i) //count
nb elts tableau print("ind i elt tabi
ltbrgt") print('nombre elements
'.count(tab).'ltbrgt') tab5 "le
6-ieme" tab "encore" //rajouté à la fin
du tableau for (i0 i lt count(tab) i)
print("indice i elt tabi ltbrgt") ?gt
15Tableaux
- Cas général
- tab si l'indice n'est pas déclaré, il est
automatiquement affecté à l'indice le plus élevé
1. - La fonction "count(tab)" retourne le nombre
d'éléments contenus dans le tableau tab. - Tableaux dynamiques
- On peut supprimer une case au milieu d'un tableau
avec la fonction unset(). - Le nombre d'éléments du tableau va alors diminuer
de 1 mais pas nécessairement l'indice max (sauf
si l'élément supprimé est le dernier du tableau) - array_values(tableau) retourne un tableau
contenant les case définies du tableau (pas de
cases non définies). - ex nouveau_tabarray_values(tab)
16Tableaux dynamiques
lt?php tab array("bonjour", 3, " tout", -5.4, "
monde") for (i0 i lt count(tab)
i) print("indice i element tabi
ltbrgt") tab7 "un nouveau en 7" print('ajout
en 7 tab7 '.tab7.'ltbrgt') print('nombre
element '.count(tab).'ltbrgt') unset(tab3)
//supprime la case 3! print('apres unset un
element nombre element '.count(tab).'ltbrgt'
unset(tab) //supprime tout le
tableau! print('apres unset le tableau
isset(tab) '.isset(tab).'ltbrgt') tab0"un
nouveau" //on redéclare le tableau! tab"suiva
nt" print('apres 2 affectations ltbrgt') for
(i0 i lt count(tab) i) print("indice
i element tabi ltbrgt") ?gt
6
17Tableaux multi-dimensionnels
- L'imbrication des tableaux est possible et permet
l'ajout de plusieurs dimensions. - mois array("Janvier", "Février", "Mars",
"Avril", "Mai", "Juin", "Juillet", "Août",
"Septembre", "Octobre", "Novembre", "Décembre") - jour array("Dimanche", "Lundi", "Mardi",
"Mercredi", "Jeudi", "Vendredi", "Samedi") - element_date array(mois, jour)
- L'accès aux valeurs contenues dans un tableau
indicé s'effectue par l'intermédiaire de l'indice
numérique du tableau conteneur suivi de celui du
second tableau. - MM element_date00
- //affecte "Janvier" à MM
- echo element_date15 . " 7 " .
element_date02 . "2002" - // retourne "Vendredi 7 Mars 2002"
18Tableaux associatifs (cle gt valeur)
- Un array en PHP est un ensemble ordonné
d'éléments accessibles par un index (ordered map)
- c'est une association de paire (clé, valeur) la
clé permet d'accéder à l'élément - la clé est soit un entier soit une chaîne
- la valeur peut être de n'importe quel type
- l'array peut être utilisé comme
- tableau classique,
- liste,
- pile, file, ensemble,
- table accessible par clé, dictionnaire.
- array(cle0 gt valeur0, cle1 gt valeur1, ...)
crée un tableau avec les éléments indiqués dans
l'ordre. Les éléments du tableau sont
respectivement les paires (clé, valeur)
spécifiées - le premier élément a la clé cle0 et la valeur0
- le second élément a la clé cle1 et la valeur1
-
- les éléments se manipulent par tabclé où clé
est un entier ou un string.
19Tableaux associatifs
lt?php jourSemaine array("lundi" gt "travail",
"mardi" gt "travail", "mercredi" gt "travail",
"jeudi" gt "travail", "vendredi" gt "travail",
"samedi" gt "week-end", "dimanche" gt
"week-end") printf("le samedi est un jour de
".jourSemaine"samedi"."ltbrgt") foreach
(jourSemaine as jour gt sorte) print("jour
sorte ltbrgt") compte 0 foreach
(jourSemaine as sorte) if (sorte
"travail") compte printf(" il y a
compte jours de travail sur ".count(jourSemaine)
) ?gt
- foreach(array_expression as key gt value)
- boucle où les variables key et value prennent
successivement les clés et valeurs des éléments
du tableau - foreach(array_expression as value)
- boucle où la variable value prend successivement
les valeurs des éléments du tableau
20Fonctions relatives aux tableaux
- affectation de tableau crée une copie de
l'ensemble du tableau (éléments voire clés) - ce n'est pas une copie de pointeur comme en
langage C ou de référence en JAVA ! - in_array(valeur,tableau)
- retourne true si la valeur se trouve dans le
tableau - explode(séparateur, chaîne)
- découpe la chaîne en sous-chaines en utilisant le
séparateur (chaine). Le résultat est le tableau
de sous-chaines obtenues - implode (séparateur, array)
- retourne une chaîne contenant tous les éléments
du tableau séparés par le séparateur (de type
chaîne) - sort (array)
- trie le tableau array (associatif ou non) dans
l'ordre croissant des éléments ! - ksort (array)
- trie le tableau associatif suivant l'ordre
croissant des clés. Elle maintient la
correspondance entre les clés et les valeurs.
21Fonctions relatives aux tableaux
- array_key_exists(cle, tableau)
- retourne true si une clé existe dans un tableau
- array_keys(tableau)
- retourne un tableau de toutes les clés du tableau
en paramètre - array_splice(tableau, position, nombre)
- supprime nombre éléments du tableau à partir de
la position - array_splice(tableau, position, nombre,
tab_remplace) - supprime et remplace par les éléments du tableau
de remplacement - array_pop(tableau)
- dépile et retourne le dernier élément du tableau.
retourne NULL si le tableau est vide - array_push(tableau, elem1, elem2, ...)
- empile à la fin du tableau les éléments
- array_shift(tableau)
- dépile le premier élément
- array_slice(tableau, position, nombre)
- retourne un sous-tableau extrait du tableau à
partir de la position et composé de nombre
éléments - array_sum(tableau)
- retourne la somme des valeurs du tableau
22Exemple
lt?php tab array("bonjour"gt3, "tout"gt0, "
monde"gt-5) foreach (tab as key gt value)
print("key value , ") print('ltbrgttriltbrgt')
t2 tab //affectation de tableau sort(t2)
//tri par ordre croissant des éléments! foreach
(t2 as key gt value) print("key value ,
") print('ltbrgtsort by keyltbrgt') t2
tab ksort(t2) //tri par un tableau associatif
par ordre croissant des clés ! foreach (t2 as
key gt value) print("key value ,
") print('ltbrgt') if (in_array(0,tab))
print('in_array(0,tab) trueltbrgt') //existence
d'un elt ?gt
bonjour 3 , tout 0 , monde -5 , tri 0 -5
, 1 0 , 2 3 , sort by key monde -5 ,
bonjour 3 , tout 0 , in_array(0,tab) true
Exécution
23Pointeur courant d'un tableau
- Chaque tableau a un pointeur interne, qui est
initialisé lorsque le premier élément est inséré
dans le tableau. - current(tableau)
- retourne l'élément courant pointé par le pointeur
interne - next(tableau)
- incrémente le pointeur interne
- retourne la valeur qu'il pointe,
- retourne false s'il déborde du tableau ou si
l'élément pointé est NULL - end(tableau)
- positionne le pointeur interne du tableau
jusqu'au dernier élément. - retourne la valeur de cet élément
- prev(tableau)
- décrémente le pointeur plutôt que de l'avancer.
- retourne la valeur du nouvel élément pointé ou
false si l'élément pointé est NULL - reset(tableau)
- replace le pointeur de tableau au premier
élément. - retourne la valeur du premier élément.
24Pointeur courant d'un tableau
lt?php tab array("bonjour", 3, "tout", "monde",
-5) print('current(tab) '.current(tab).'ltbrgt')
print('next(tab) '.next(tab).'ltbrgt') print('ne
xt(tab) '.next(tab).'ltbrgt') print('next(tab)
'.next(tab).'ltbrgt') print('next(tab)
'.next(tab).'ltbrgt') reset(tab) print('apres
reset current(tab) '.current(tab).'ltbrgt') end
(tab) print('apres end current(tab)
'.current(tab).'ltbrgt') print('prev(tab)
'.prev(tab).'ltbrgt') ?gt
Exécution
current(tab) bonjour next(tab) 3 next(tab)
tout next(tab) monde next(tab) -5 apres reset
current(tab) bonjour apres end current(tab)
-5 prev(tab) monde
25Opérateurs sur les tableaux
- Soient tab1 et tab2 deux tableaux définis
- tab1 tab2
- sur des tableaux associatifs retourne TRUE si
les 2 tableaux ont les mêmes paires (clé,
élément) - sur des tableaux indicés retourne TRUE si les 2
tableaux ont les mêmes éléments aux mêmes
indices. - tab1 tab2
- tableaux associatifs retourne TRUE si les 2
tableaux ont les mêmes paires (clé, élément) dans
le même ordre. - tab1 tab2
- tableaux associatifs réalise l'union des
paires sur le critère des clés!. dans le cas
d'éléments de même clé, c'est celui du tableau de
gauche qui est retenu.
26Expressions régulières
27Expressions régulières
- Objectif traitements complexes sur les chaînes
de caractères - Deux familles d'expressions régulières
- en php3 les ereg (Posix, maintenant peu
utilisées) - depuis php4 les pcre (Perl-compatible regular
expressions). Elles sont 4 à 5 fois plus rapides
et plus puissantes que les ereg. - Quelques exemples d'applications
- vérifier la validité des chaînes de caractères
(email, entrée chiffrée, entrée texte, etc...) - extraire des parties bien précises d'une chaîne,
d'un texte, d'une page, etc... - rendre des emails et url cliquables dans vos
textes. - gérer des éléments spécifiques placés entre vos
balises perso, mise en forme, style spécial, ...
28Expressions régulières
- Une expression régulière permet de définir un
motif à l'aide de - littéraux
- a, toto,
- symboles
- début de chaîne
- fin de chaîne
- . n'importe quel caractère (une seule fois)
- symboles quantificateurs
- 0, 1 ou plusieurs occurrences de ce qui
précède - 1 ou plusieurs occurrences de ce qui précède
- ? 0 ou 1 occurrence de ce qui précède
- intervalles de reconnaissance
- a3 correspond exactement à aaa
- a2, correspond à un minimum de deux a
consécutifs (aa, aaa,) - a2,4 correspond uniquement à aa, aaa, aaaa
29Expressions régulières
- classes de caractères
- ..-..
- Le tiret représente l'intervalle à l'intérieur de
la classe. Il s'agit d'un métacaractère s'il est
placé dans cette position. Pour permettre sa
lecture en tant que caractère "tiret" il faut le
placer en début de la classe comme ceci -.... - rm
- choix entre les caractères indiqués entre
crochets. Par exemple, arme signifie qu'on
considère les chaînes are ou ame, lth123456gt
signifie que l'on recherche une balise de titre
lth1gt lth2gt lth3gt, etc... - lth1-6gt
- intervalle de recherche de 1 à 6 - affichera les
balises de titre lth1gt lth2gt etc... jusque lth6gt - 0-9
- tous les chiffres de 0 à 9, etc...
- alternative, intervalle et classe complementée
- p(aii)n
- la barre verticale détermine une alternative.
Cette expression signifie tout ce qui s'écrit
pain ou pin. Les parenthèses délimitent la portée
de l'alternative. - (DeA)_at_
- L'alternative dans le motif lui-même. Cette
expression signifie tout ce qui commence par De_at_
ou A_at_ - 1
- La classe complémentée. l'accent circonflexe en
début d'intervalle désigne tout sauf ce qui est
énuméré ensuite. Ici 1 signifie tout sauf le
chiffre 1, 1-6 reconnaît tout ce qui est
énuméré sauf les chiffres de 1 à 6.
30Expressions régulières
- classes prédéfinies
- alpha n'importe quelle lettre
- digit n'importe quel chiffre
- xdigit caractères héxadécimaux
- alnum n'importe quelle lettre ou chiffre
- space n'importe quel espace blanc
- punct n'importe quel signe de ponctuation
- lower n'importe quelle lettre en
minuscule - upper n'importe quelle lettre capitale
- blank espace ou tabulation
- graph caractères affichables et
imprimables - cntrl caractères d'échappement
- print caractères imprimables exceptés
ceux de contrôle
31Ancrages et classes génériques
- \n indique une nouvelle ligne
- \r indique un retour chariot
- \b indique une limite de mot dans une chaîne de
caractères - \B indique ce qui n'est pas une limite de mot
dans une chaîne de caractères - \d indique que la classe de caractères suivant
est un chiffre (digit). Equivalent à 0-9 - \D indique la classe de caractères suivant
n'est pas un chiffre.Equivalent à 0-9 - \s indique un espace blanc \t, \r, \n, \f.
(space) - \S indique ce qui n'est pas un espace blanc
- \w indique un mot qui correspond à la classe
0-9a-zA-Z_L'underscore étant compris dans
cette classe. Les accentués le sont aussi mais
cela dépend de la configuration serveur. - \W indique ce qui n'est pas un mot. Equivalent
à 0-9a-zA-Z_.
32Exemples
- lt?php chaine"Je veux apprendre les expressions
régulières" // on recherche la valeur "Je" en
début de chaine motif"Je"// on recherche la
valeur "res" en fin de chaine motif"res\."
// on recherche la valeur "express" dans le mot
expressions motif"\bexpress"
motif"\sexpress" motif"\Wexpress" // on
recherche la valeur "sions" dans le mot
expressions motif"sions\b" motif"sions\W"
// on recherche la valeur "eu" dans le mot veux
motif"\Beu" motif"\Seu" motif"\weu"
?gt
33preg_match(motif,chaîne)
- preg_match(motif, chaîne) renvoie 1 si la
chaîne contient le motif, 0 sinon - le motif est délimité par deux /
- le motif /U.x/ veut dire
- Un mot commençant par 'U', suivi d'un caractère,
suivi d'une chaîne de caractères (peut être
vide), suivi du caractère 'x'. - Le métacaractère '.' remplace un seul caractère
- Le métacaractère '' remplace une chaîne (vide ou
non) - Exemple vérifier si une chaîne ne contient que
des chiffres - echo preg_match("/0-9/", "01234")
- remarque si on ne précise pas le début et la
fin de chaîne, cherche si la chaîne contient le
motif gt serait toujours vrai puisque le motif
contient des chiffres pouvant être itérés 0 fois.
34Exemple
lt?php texte "Les expressions régulières
viennent du monde Unix." echo "texte texte
ltbrgt" echo 'occurrence de "monte" ' echo
preg_match("/monte/", texte) echo
'ltbrgtoccurrence de "mond" ' echo
preg_match("/mond/", texte) echo
'ltbrgtoccurrence de "U.x" ' echo
preg_match("/U.x/", texte) ?gt
Exécution occurrence de "monte" 0 occurrence de
"mond" 1 occurrence de "U.x" 1
35preg_match_all(motif,chaîne, tableau)
- preg_match_all(motif, chaîne, tableau)
- analyse la chaîne selon le motif et stocke dans
le tableau les occurrences de la souschaîne qui
satisfont l'expression régulière du motif
tableau0n contient la (n1)-ième occurrence
trouvée - renvoie 1 si la chaîne contient au moins un motif
de l'expression régulière sinon renvoie 0 - d'autres paramètres sont possibles ainsi que des
résultats dans tableau1
36Exemple
lt?php texte "Les expressions régulières
viennent du monde Unix." date "4/05/2003" if
(preg_match_all("/es/", texte,
tab_occurrences)) echo "texte contient
".count(tab_occurrences0) ." fois le motif
\"es\"ltbrgt" if (preg_match_all("/0-9/",
date, tab_occurrences)) echo "date se
décompose en ltbrgt" ."jour
".tab_occurrences00 ."ltbrgt mois
".tab_occurrences01 ."ltbrgt annee
".tab_occurrences02." ltbrgt" ?gt
Les expressions régulières viennent du monde
Unix. contient 3 fois le motif "es" 4/05/2003 se
décompose en jour 4 mois 05 annee 2003
Exécution
37preg_split, preg_replace
- tableau preg_split(motif, chaîne)
- découpe(éclate) la chaîne selon le motif
séparateur - stocke dans le tableau les sous-chaînes séparées
par le motif. tableaun contient la (n1)-ième
sous-chaîne. - chainepreg_replace(motif, substitut, chaîne)
- fonction chercher-remplacer classique
- remplace, dans la chaîne, les sous-chaînes
correspondant à l'expression régulière du motif
par la chaîne substitut et retourne la chaîne
obtenue. - la fonction fonctionne aussi avec des tableaux de
recherche et remplacement et aussi sur des
tableaux de chaînes à soumettre... - chaine preg_replace (motif, substitut, chaîne,
limite) - Si l'entier limite est renseigné, le nombre de
remplacements sera limité.
38Exemple pour preg_split
lt?php texte "Les expressions régulières
viennent du monde Unix." tab_recup
preg_split("/,\.\s/", texte) echo
texte."ltbrgt découpé aux espaces, virgules et
point ltbrgt" for (i 0 i lt
count(tab_recup) i) echo "une découpe
".tab_recupi."ltbrgt" ?gt
\. despécialise le métacaractère '.', il devient
le caractère '.' \s signifie espace, tabulation
ou passage à la ligne
Les expressions régulières viennent du monde
Unix. découpé aux espaces, virgules et point
une découpe Les une découpe expressions une
découpe régulières une découpe viennent une
découpe du une découpe monde une découpe
Unix une découpe
Exécution
ce blanc est dû au point de fin de ligne
39Exemple pour preg_replace
lt?php date "4052003" echo
date."ltbrgt" date preg_replace("/(0-9)(0
-9)(0-9)/", "2 1 year 3", date) echo
date."ltbrgt" ?gt
Exécution 4052003 05 4 year 2003
Les parenthèses () définissent des
sous-expressions à capturer, de forme (0-9)
Il y a 3 sous-expressions capturées "4" "05"
"2003" La chaîne substitut comporte des 1, 2,
3 qui font référence, dans l'ordre, aux chaînes
capturées. Le remplacement se fait en remplaçant
les i par la sous-expression capturée corresponda
nte.
40preg_replace_callback(motif, fonction, chaîne)
- Le comportement de preg_replace_callback est
presque identique à celui de preg_replace, hormis
le fait qu'à la place du paramètre de
remplacement, il faut spécifier une fonction de
callback qui sera appelée, avec les éléments
trouvés en arguments. Cette fonction retourne
alors la chaîne de remplacement. - La fonction ucfirst(chaîne) met la première
lettre de la chaîne en majuscule.
lt?php chaine'Mise en majuscules des initiales
du prénom composé anne-marie.' function
mot_compose(masque) return ucfirst(masque1).
'-'.ucfirst(masque2) echo
preg_replace_callback('(alpha)-(alpha
)','mot_compose',chaine) ?gt
les deux expressions capturées
Exécution Mise en majuscules des initiales du
prénom composé Anne-Marie.
41tableaupreg_grep (motif, tableau, option)
- preg_grep retourne dans un tableau les éléments
extraits d'un autre tableau correspondant au
motif, ou ne correspondant pas au motif avec
l'option PREG_GREP_INVERT.
lt?php tabloarray('1','2.25','3','4.75','6','7.3
3','9','11','14.45','19') trouvearray_values(p
reg_grep('\d\.\d',tablo))
nbcount(trouve) for(i0iltnbi)
echo trouvei.'-' ?gt
Exécution 2.25 - 4.75 - 7.33 - 14.45 -
42Variables superglobales
43Variables superglobales prédéfinies
- Depuis PHP 4.1.0, accès à un jeu de tableaux
prédéfinis contenant les variables du serveur,
les variables d'environnement et celle d'entrées.
Ces tableaux sont automatiquement disponibles
dans tous les environnements d'exécution, sans
avoir à utiliser le mot réservé global. Ils sont
dits 'superglobaux'. - Depuis la version 4.2.0 de PHP, l'option
register_globals se trouvant dans le fichier
PHP.ini est initialisée à OFF par défaut (ON
auparavant gt les anciennes méthodes d'accès aux
variables globales ne sont plus utilisables). - plusieurs hébergeurs ayant upgradé PHP laissent
register_globals à OFF... - Cette méthode permet de résoudre pas mal de trous
de sécurité dans les scripts. - Une autre option importante de la configuration
PHP track_vars, positionnée à ON, permet de
récupérer les variables passées par formulaire,
url et cookies dans des tableaux prédéfinis. - Avec ces options positionnées ainsi, on peut
utiliser les tableaux associatifs ci-après pour
récupérer les variables superglobales.
44Variables superglobales prédéfinies
- GLOBALS
- Contient une référence sur chaque variable qui
est en fait disponible dans l'environnement
d'exécution global. Les clés de ce tableau sont
les noms des variables globales. - _SERVER
- Les variables fournies par le serveur web, ou
bien directement liées à l'environnement
d'exécution du script courant. - Remarque il existe également une fonction
phpinfo() qui permet de connaître la
configuration et la version exacte de PHP
qu'utilise le serveur où vous êtes hébergé.
45Variables d'environnement
- Variables superglobales prédéfinies accessibles
dans tous les scripts via _SERVER
_SERVER'DOCUMENT_ROOT' Racine du
serveur _SERVER'HTTP_ACCEPT_LANGUAGE' Langage
accepté par le navigateur _SERVER'HTTP_HOST'
Nom de domaine du serveur _SERVER'HTTP_USER_AGEN
T' Type de navigateur _SERVER'PATH_INFO'
Chemin web du script _SERVER'PATH_TRANSLATED'
Chemin complet du script _SERVER'REQUEST_URI'
Chemin du script _SERVER'REMOTE_ADDR' Adresse
IP du client _SERVER'REMOTE_PORT' Port de la
requête HTTP _SERVER'QUERY_STRING' Liste des
paramètres passés au script _SERVER'SERVER_ADDR'
Adresse IP du serveur _SERVER'SERVER_ADMIN'
Adresse de l'administrateur du serveur _
SERVER'SERVER_NAME' Nom local du
serveur _SERVER'SERVER_SIGNATURE' Type de
serveur _SERVER'REQUEST_METHOD' Méthode
d'appel du script
46Variables superglobales prédéfinies
- _GET
- Les variables fournies au script via la chaîne de
requête URL. - _POST
- Les variables fournies par le protocole HTTP en
méthode POST. - _COOKIE
- Les variables fournies par le protocole HTTP,
dans les cookies. - _FILES
- Les variables fournies par le protocole HTTP,
suite à un téléchargement de fichier.
47Exemple
lt?phpbouton _POST'send'if(!empty(bouton)
) nom trim(_POST'nom') prenom
trim(_POST'prenom') if(!empty(nom)
!empty(prenom)) echo 'Bonjour,
'.prenom.' '.nom else echo
'vous n\'avez pas rempli tous les champs'
?gt
dans le tableau associatif _POST, une entrée à
été créée avec le nom de chaque variable du
formulaire, ici deux champs nom et prénom.
Le formulaire contient ltinput type"submit"
value"envoyer" name"send"gt
Remarque !empty permet de vérifier que -
la variable n'est pas vide - la variable ne
contient pas 0 - donc la variable existe !
(plus intéressant que isset)
48Autre exemple
lt?php if(isset(_POST)) foreach(_POST as
keygtval) echo key.'gt'.val.'ltpgt'
else echo 'le formulaire n\'a pas été
envoyé'?gt
49Exemple récupération d'un fichier
- _FILES'variable''name' Le nom original du
fichier provenant de la machine de l'utilisateur - _FILES'variable''type' Le type mime du
fichier - _FILES'variable''size' Le taille du
fichier en bytes - _FILES'variable''tmp_name' Le nom
temporaire du fichier stocké sur le serveur - _FILES'variable''error' Le code erreur
associé à l'upload (attention cette option à été
ajoutée en PHP 4.2.0)
Formulaire ltform enctype"multipart/form-data"
action"exemple2.php" method"post"gtltinput
name"fichier" type"file"gtltinput type"submit"
value"send" name"bouton"gtlt/formgt
50Exemple récupération d'un fichier
lt?phpbouton _POST'bouton'if(!empty(bouto
n)) fichier _FILES'fichier''name'
size _FILES'fichier''size' tmp
_FILES'fichier''tmp_name' type
_FILES'fichier''type' error
_FILES'fichier''error' max
10000 if(isset(fichier)) if(size lt
max) echo 'Nom d\'origine
gt'.fichier.'ltbr /gt' echo 'Taille
gt'.size.'ltbr /gt' echo 'Nom sur le serveur
gt'.tmp.'ltbr /gt' echo 'Type de fichier
gt'.type.'ltbr /gt' echo 'Code erreur
gt'.error.'ltbr /gt' else echo 'Le
fichier est trop volumineux' else
echo 'aucun fichier envoyé'?gt
51Variables superglobales prédéfinies
- _ENV
- Les variables fournies par l'environnement.
- _REQUEST
- Les variables fournies au script par n'importe
quel mécanisme d'entrée, et qui ne doivent
recevoir qu'une confiance limitée. - Cette variable n'inclut pas argv et argc passées
par la ligne de commande. Elles seront présentes
dans la variable _SERVER. - La présence et la valeur des entrées de ce
tableau sont réglés par la directive
variables_order. - Depuis PHP 4.3.0, les informations de la variable
_FILES ne sont plus intégrées dans la variable
_REQUEST. - _SESSION
- Les variables qui sont en fait enregistrées dans
la session attachée au script (voir chapitre
ultérieur sur les sessions).
52Fichiers
53Télécharger un fichier
- Côté formulaire html
- Il faut utiliser un champ input de type "file"
contenant le nom du fichier à télécharger. - Dans un champ input caché "hidden", préciser la
taille max en octets - l'option file_uploads de php doit être à "ON"
pour pouvoir télécharger des fichiers (on peut le
vérifier avec phpinfo())
ltform action"upload1.php" method"post"
enctype"multipart/form-data"gt ltinput
type"hidden" name"MAX_FILE_SIZE"
value"5000"gt ltinput type"file" name"fichier"
size"20" maxlength"80"gt ltinput type"submit"
value"Envoyer"gt lt/formgt
54Télécharger un fichier
lthtmlgt ... lt?php if (_FILES'fichier''error'gt0
) echo "Erreur !" exit echo "name
"._FILES'fichier''name' ." size
"._FILES'fichier''size' ." type
"._FILES'fichier''type' .'ltbrgtltbrgtContenu
ltbrgtltbrgt' flot fopen(_FILES'fichier''tmp_
name', "r") while (!feof(flot)) ligne
fgets(flot,1000) echo nl2br(htmlentities(lign
e)) fclose(flot) ?gt . . .
55Télécharger un fichier
- nl2br retourne une chaîne de caractères après
avoir inséré un retour à la ligne 'ltbrgt' devant
toutes les nouvelles lignes. - htmlentities convertit tous les caractères
éligibles en entités HTML. - Ex é sera converti en eacute lt? converti en
lt? - Pour les codes d'erreur _FILES'nom_fichier''er
ror' - 1 UPLOAD_ERR_INI_SIZE (taille fichier dépasse
la limite autorisée par le serveur) - 2 UPLOAD_ERR_FORM_SIZE (taille fichier dépasse
la limite autorisée par le formulaire) - 3 UPLOAD_ERR_PARTIAL (fichier interrompu
pendant le transfert) - 4 UPLOAD_ERR_NO_FILE (taille fichier 0)
56Manipuler un fichier
- fopen (nom_fichier, mode)
- ouvre un fichier ou une URL selon le mode
spécifié - retourne une ressource flot sinon False
- le paramètre mode (de type string) peut prendre
les valeurs suivantes - 'r' lecture seule, pointeur de lecture en début
de fichier - 'r' en lecture et écriture, et pointeur au début
du fichier. - 'w' en écriture seul si le fichier existe, son
contenu est écrasé sinon il est créé - 'w' en lecture et écriture si le fichier
existe, son contenu est écrasé sinon il est créé - 'a' en écriture seul place le pointeur
d'écriture à la fin du fichier - 'a' en lecture et écriture place le pointeur à
la fin du fichier - peut contenir 'b' en système windows pour un
fichier en binaire - feof(flot)
- retourne true si le pointeur est à la fin du
fichier, ou s'il y a une erreur, sinon retourne
false - le paramètre flot doit être une ressource flot
57Manipuler un fichier
- fgets (flot, nombre)
- retourne la chaîne lue dans le flot à partir du
pointeur courant jusqu'à concurrence de nombre
octets, ou bien la fin du fichier, ou encore un
retour chariot le pointeur de fichier est
changé en conséquence - sinon false en cas d'erreur
- le paramètre flot doit être une ressource flot
- le paramètre nombre a une valeur par défaut de
1024 - fwrite (flot, chaine) ou fputs(flot, chaîne)
- les deux noms sont équivalents
- écrit le contenu de la chaîne dans le fichier
flot. - retourne le nombre d'octets écrits sinon, en cas
d'erreur, FALSE - fclose(flot)
- ferme le flot
- le paramètre flot doit être une ressource flot
58Lire un fichier caractère par caractère
lt?php ressource_fichier fopen('test.txt',
'r') //Ouvre le fichier en lecture seule, on
// supposera qu'il existe sous peine d'avoir une
erreur if(ressource_fichier) //Si ressour
ce_fichier ne vaut pas FALSE on continue
contenu_fichier ''"
while(!feof(ressource_fichier)) //Tan
t que l'on est pas à la fin du fichier
contenu_fichier . f
getc(ressource_fichier)
//Récupère le caractère en cours et l'ajoute au co
ntenu de contenu_fichier
fclose(ressource_fichier)
echo contenu_fichier //affiche le co
ntenu du fichier ?gt
59Lire un fichier ligne par ligne
ressource_fichier fopen('test.txt', 'r')
if(ressource_fichier) //Si ressource_fich
ier ne vaut pas FALSE on continue
contenu_fichier "''
while(!feof(ressource_fichier)) //Tan
t que l'on est pas à la fin du fichier
contenu_fichier . f
gets(ressource_fichier) //Récupère la ligne en
cours et l'ajoute au contenu de la variable cont
enu_fichier fclose(resso
urce_fichier) echo contenu_fichier
//affiche le contenu du fichier ?gt
60Lire un fichier sous forme de tableau
lt?php tableau file('test.txt') //Place
le contenu du fichier dans un tableau //on
suppose que le fichier existe sous peine d'avoir
une erreur // chaque ligne du tableau correspond
à une ligne du fichier if(is_array(tableau))
//Si la variable tableau est bien un
tableau, on peut continuer
contenu_fichier ''
foreach(tableau AS ligne)
contenu_fichier . ligne
echo contenu_fichier
//Affiche le contenu du fichier, notez que
l'on a pas besoin d'utiliser fclose() ici
?gt
61Vérifier si un fichier existe, effacer un fichier
lt?php if(file_exists('test.txt'))
echo 'Le fichier existe'
else echo 'Le fichier n\'
existe pas' ?gt
lt?php if(file_exists('test.txt'))
unlink('test.txt') ?gt