Fonctions - PowerPoint PPT Presentation

1 / 61
About This Presentation
Title:

Fonctions

Description:

Cela entra ne la possibilit de modification des variables du programme appelant impliqu es par la fonction. // Passage d'arguments par r f rence ... – PowerPoint PPT presentation

Number of Views:39
Avg rating:3.0/5.0
Slides: 62
Provided by: SEC1184
Category:

less

Transcript and Presenter's Notes

Title: Fonctions


1
Fonctions
2
Fonctions
  • 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)

3
Exemple
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
4
Fonctions 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
5
Paramè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
6
Passage 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
7
Fonction à 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
8
Fonction à 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
9
Porté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.

10
Exemple
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
11
Variables 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.

12
Exemple
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
13
Tableaux
14
Tableaux 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
15
Tableaux
  • 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)

16
Tableaux 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
17
Tableaux 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"

18
Tableaux 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.

19
Tableaux 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

20
Fonctions 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.

21
Fonctions 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

22
Exemple
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
23
Pointeur 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.

24
Pointeur 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
25
Opé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.

26
Expressions régulières
27
Expressions 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, ...

28
Expressions 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

29
Expressions 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.

30
Expressions 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

31
Ancrages 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_.

32
Exemples
  • 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

33
preg_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.

34
Exemple
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
35
preg_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

36
Exemple
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
37
preg_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é.

38
Exemple 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
39
Exemple 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.
40
preg_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.
41
tableaupreg_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 -
42
Variables superglobales
43
Variables 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.

44
Variables 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é.

45
Variables 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
46
Variables 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.

47
Exemple
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)
48
Autre 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
49
Exemple 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
50
Exemple 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
51
Variables 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).

52
Fichiers
53
Té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
54
Télécharger un fichier
  • Côté script php

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 . . .
55
Té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)

56
Manipuler 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

57
Manipuler 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

58
Lire 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
59
Lire 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
60
Lire 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
61
Vé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
Write a Comment
User Comments (0)
About PowerShow.com