Vous êtes sur la page 1sur 182

Chapitre 3.

Introduction à PHP

La structure de PHP
Nous allons couvrir pas mal de terrain dans cette section. Ce n'est pas trop
difficile, mais je vous recommande de le parcourir avec soin, car il jette les
bases de tout le reste de ce livre. Comme toujours, il y a quelques questions
utiles à la fin du chapitre que vous pouvez utiliser pour tester ce que vous
avez appris.
Utilisation des commentaires
Il existe deux façons d'ajouter des commentaires à votre code PHP. La première
transforme une seule ligne en commentaire en la faisant précéder d'une paire de
barres obliques, comme ceci :

//Ceci est un commentaire

Cette version de la fonction de commentaire est un excellent moyen de


supprimer temporairement une ligne de code d'un programme qui vous donne
des erreurs. Par exemple, vous pouvez utiliser un tel commentaire pour
masquer une ligne de code de débogage jusqu'à ce que vous en ayez besoin,
comme ceci :

// echo "X est égal à $x" ;

Vous pouvez également utiliser ce type de commentaire directement après une


ligne de code pour décrire son action, comme ceci :

$x+= 10 ; // Incrémente $x de 10

Lorsque vous avez besoin de commentaires sur plusieurs lignes, il existe un


deuxième type de commentaire, qui ressemble à Exemple 3-2.
Exemple 3-2. Un commentaire multiligne
<?php
/*Ceci est une rubrique
decommentaires multilignes
qui ne seront pas interprétés
*/
?>

Vous pouvez utiliser les paires de caractères /* et */ pour ouvrir et fermer les
commentairespresque partout où vous le souhaitez dans votre code. La plupart
des programmeurs, sinon tous, utilisent cette construction pour commenter
temporairement des sections entières de code qui ne fonctionnent pas ou qui,
pour une raison ou une autre, ne souhaitent pas être interprétées.

ATTENTION
Une erreur courante consiste à utiliser /* et */ pour commenter une grande section de code qui
contient déjà une section commentée qui utilise ces caractères. Vous ne pouvez pas imbriquer
les commentaires de cette façon ; l'interpréteur PHP ne saura pas où se termine un commentaire
et affichera une erreur
un message. Cependant, si vous utilisez un éditeur de programme ou un IDE avec coloration
syntaxique, ce type d'erreur est plus facile à repérer.

Syntaxe de base
PHP est un langage assez simple avec des racines en C et Perl, mais il ressemble
plus à Java. Il est également très flexible, mais il y a quelques règles que vous
devez apprendre sur sa syntaxe et sa structure.

Points-virgules
Vous avez peut-être remarqué dans les exemples précédents que les commandes
PHP se terminaient par un point-virgule, comme ceci :

$x += 10 ;

La cause la plus fréquente d'erreurs que vous rencontrerez avec PHP est
probablement l'oubli de ce point-virgule. Cela amène PHP à traiter plusieurs
instructions comme une seule instruction, qu'il est incapable de comprendre, ce qui
l'incite à produire un message d'erreur Parse.

Le symbole $
Le symbole $ est désormais utilisé de différentes manières par
différentslangages de programmation. Par exemple, si vous avez déjà écrit en
BASIClangage, vous aurez utilisé le $ pour terminer les noms de variables pour les
désigner comme des chaînes.
En PHP, cependant, vous devez placer un $ devant toutes les variables. Ceci est
nécessaire pour rendre l'analyseur PHP plus rapide, car il sait instantanément
chaque fois qu'il rencontre une variable. Que vos variables soient des nombres, des
chaînes ou des tableaux, elles doivent toutes ressembler à celles deExemple 3-3.
Exemple 3-3. Trois types différents d'affectation de variables
<?php
$moncompteur= 1 ;
$machaîne ="Bonjour";
$montableau =array("Un", "Deux", "Trois");
?>
Et vraiment c'est à peu près toute la syntaxe dont vous devez vous souvenir.
Contrairement aux langages qui sont très stricts sur la façon dont vous indentez
et disposez votre code (par exemple,Python), PHP vous laisse totalement libre
d'utiliser (ou de ne pas utiliser) toutes les indentations et tous les espacements que
vous aimez. En fait, une utilisation judicieuse des espaces blancs est généralement
encouragée (avec des commentaires complets) pour vous aider à comprendre votre
code lorsque vous y revenez. Cela aide également les autres programmeurs
lorsqu'ils doivent maintenir votre code.

variables
Il y a une métaphore simple qui vous aidera à comprendrece que sont les
variables PHP. Considérez-les simplement comme de petites (ou grandes)
boîtes d'allumettes ! C'est vrai, des boîtes d'allumettes sur lesquelles vous avez
peint et écrit des noms.

Variables de chaîne
Imaginez que vous avez une boîte d'allumettes sur laquelle vous avez écrit le
mot nom d'utilisateur. Vous écrivez ensuite Fred Smith sur un morceau de
papier et le placez dans la boîte (voirIllustration 3-2). Eh bien, c'est le même
processus que d'attribuer une valeur de chaîne à une variable, comme ceci :

$nom d'utilisateur= "Fred Smith" ;


Illustration 3-2. Vous pouvez considérer les variables comme des boîtes
de correspondance contenant des éléments

Les guillemetsindiquent que "Fred Smith" est une chaîne de caractères. Vous
devez placer chaque chaîne entre guillemets ou apostrophes (guillemets
simples), bien qu'il existe une différence subtile entre les deux types de
guillemets, qui est expliquée plus loin. Lorsque vous voulez voir ce qu'il y a
dans la boîte, vous l'ouvrez, sortez le morceau de papier et lisez-le. En PHP,
cela ressemble à ceci :

echo$nom d'utilisateur ;

Ou vous pouvez l'affecter à une autre variable (photocopiez le papier et placez


la copie dans une autre boîte d'allumettes), comme ceci :

$ utilisateur_actuel= $nom d'utilisateur ;

Si vous souhaitez commencer à essayer PHP par vous-même, vous pouvez essayer
d'entrer le
exemples de ce chapitre dans un IDE (comme recommandé à la fin de
Chapitre 2) pour voir des résultats instantanés, ou vous pouvez entrer le code
dans Exemple 3-4dans un éditeur de programme et enregistrez-le dans le
répertoire racine des documents de votre serveur (également abordé dans
Chapitre 2) comme test1.php.
Exemple 3-4. Votre premier programme PHP
<?php // test1.php
$nom d'utilisateur=
"Fred Smith" ; echo $nom
d'utilisateur ;
echo "<br>" ;
$ utilisateur_actuel= $nom
d'utilisateur ; echo
$utilisateur_courant ;
?>

Vous pouvez maintenant l'appeler en saisissant ce qui suit dans la barre


d'adresse de votre navigateur :

http://localhost/test1.php

REMA
RQUE
Si lors de l'installation de votre serveur Web (comme détaillé dans Chapitre 2) vous avez
changé le port attribué au serveur à autre chose que 80, alors vous devez placer ce numéro de
port dansl'URL dans cet exemple et dans tous les autres exemples de ce livre. Ainsi, par exemple,
si vous avez modifié le port en 8080, l'URL précédente devient :
http://localhost:8080/test1.php
Je ne le mentionnerai plus, alors n'oubliez pas d'utiliser le numéro de port si nécessaire
lorsque vous essayez des exemples ou que vous écrivez votre propre code.

Le résultat de l'exécution de ce code devrait être deux occurrences du nom


"Fred Smith",tilsapinst dewquijestilresultime detilechocommande $username
et le second de la commande echo $current_user.

Variables numériques
Les variables ne contiennent pas que des chaînes, elles peuvent également contenir
des nombres. Si nous revenons à l'analogie de la boîte d'allumettes, pour stocker le
nombre 17 dans la variable $count, l'équivalent serait de placer, disons, 17 perles
dans une boîte d'allumettes sur laquelle vous avez écrit le mot count :
$compte = 17 ;

Vous pouvez également utiliser un nombre à virgule flottante (contenant une


virgule décimale) ; la syntaxe est la même :

$compte = 17,5 ;

Pour lire le contenu de la boîte d'allumettes, il vous suffit de l'ouvrir et de compter


les perles. En PHP, vous assigneriez la valeur de $count à une autre variable ou
peut-être simplement la feriez-vous echo au navigateur Web.

Tableaux
Que sont donc les tableaux ? Eh bien, vous pouvez les considérer comme
plusieurs boîtes d'allumettes collées ensemble. Par exemple, disons que nous
voulons stocker les noms des joueurs pour un groupe de cinq
personnes.soccerthémjenunenarrayappelerré$équipe.Jo faistle sien,wecvieux la
colleFiMettez les boîtes d'allumettes côte à côte et notez les noms de tous les
joueurs sur des morceaux de papier séparés, en plaçant un dans chaque boîte
d'allumettes.
Sur tout le haut de l'assemblage de la boîte d'allumettes, nous écrirons le mot équipe
(voir Illustration 3-3). L'équivalent de ceci en PHP serait :

$équipe= array('Bill', 'Mary', 'Mike', 'Chris', 'Anne');


Illustration 3-3. Un tableau est comme plusieurs boîtes
d'allumettes collées ensemble

Cette syntaxe est plus compliquéeque ceux que j'ai expliqués jusqu'à présent.
Le code de construction de tableau se compose de la construction suivante :

déployer();

avec cinq cordes à l'intérieur.Chaque chaîne est entourée d'apostrophes.


Si nous voulions ensuite savoir qui est le joueur 4, nous pourrions utiliser cette
commande :

echo $équipe[3] ; // Affiche le nom Chris

La raison pour laquelle la déclaration précédente porte le numéro 3, et non 4,


est que le premierélément d'un tableau PHP est en fait le zéroième élément, donc
les numéros de joueurs seront donc de 0 à 4.

Tableaux à deux dimensions


Il y a beaucoup plus que vous pouvez faire avec les tableaux. Par exemple, au lieu
d'être célibataire
lignes dimensionnelles des boîtes d'allumettes, elles peuvent être
bidimensionnellesmatrices ou peuvent même avoir trois dimensions ou plus.
Comme exemple d'un tableau à deux dimensions, disons que nous voulons
garder une trace d'un jeu de tic-tac-toe, qui nécessite une structure de données
de neuf cellules disposées dans unCarré 3×3. Pour représenter cela avec des
boîtes d'allumettes, imaginez-en neuf collées les unes aux autres dans une matrice
de trois lignes sur trois colonnes (voirIllustration 3-4).

Illustration 3-4. Un tableau multidimensionnel simulé avec des


boîtes d'allumettes

Vous pouvez maintenant placer une feuille de papier avec un « x » ou un « o »


dans la bonne boîte d'allumettes pour chaque coup joué. Pour ce faire dans le code
PHP, vous devez configurer un
tableau contenant trois autres tableaux, comme dansExemple 3-5, dans lequel
le tableau est configuré avec un jeu déjà en cours.
Exemple 3-5. Définition d'un tableau à deux dimensions
<?php
$oxo= tableau(tableau('x', ' ', 'o'),
tableau('o','o', 'x'),
tableau('x','o', ' '));
?>

Encore une fois, nous avons progresséune étape dans la complexité, mais il est
facile à comprendre si vous maîtrisez la syntaxe de base des tableaux. Il y a
trois constructions array() imbriquées dans la construction array() externe.
Pour ensuite renvoyer le troisième élément de la deuxième ligne de ce tableau,
vous utiliserez la commande PHP suivante, qui affichera un x :

echo $oxo[1][2] ;

REMARQUE
Rappelez-vous que les index de tableau(pointeurs sur des éléments d'un tableau) commencent
à zéro, et non à un, donc le [1] dans la commande précédente fait référence au deuxième des
trois tableaux, et le [2] fait référence à la troisième position dans ce tableau. Il renverra le
contenu de la boîte d'allumettes trois le long et deux vers le bas.

Comme mentionné, nous pouvons prendre en charge des tableaux avec encore
plus de dimensions en créant simplement plus de tableaux dans des tableaux.
Cependant, nous ne couvrirons pas les tableaux de plus de deux dimensions
dans ce livre.
Et ne vous inquiétez pas si vous êtesayant encore des difficultés à maîtriser
l'utilisation des tableaux, car le sujet est expliqué en détail dansChapitre 6.

Règles de nommage des variables


Lors de la création de variables PHP, vous devez suivre ces quatre règles :
Les noms de variables doivent commencer par unlettre de l'alphabet ou le
caractère _ (trait de soulignement).

Les noms de variable ne peuvent contenir que les caractères a–z, A–Z, 0–9 et _
(souligner).

Les noms de variables ne doivent pas contenir d'espaces. Si une variable


doit comprendre plus d'un mot, elle doit être séparée par le caractère _ (trait
de soulignement) (par exemple,
$nom_utilisateur).

Variable des nomsarecas-sensitive.Jil variable$High_Scorejes ne pastilsame


comme variable $high_score.

REMARQUE
Pour autoriser les caractères ASCII étendus incluant des accents, PHP prend également en
charge les octets de 127 à 255 dans les noms de variables. Mais à moins que votre code ne soit
maintenu que par des programmeurs qui connaissent ces caractères, il est probablement
préférable de les éviter, car les programmeurs utilisant des claviers anglais auront des difficultés
à y accéder.

Les opérateurs
Les opérateurs sont les commandes mathématiques, de chaîne, de comparaison et
logiques telles que plus, moins, multiplier et diviser. PHP ressemble beaucoup à
l'arithmétique simple ; par exemple, l'instruction suivante affiche 8 :

echo 6 + 2 ;

Avant de continuer à apprendre ce que PHP peut faire pour vous, prenez un
moment pour en savoir plus sur les différents opérateurs qu'il propose.

Opérateurs arithmétiques
Les opérateurs arithmétiques font ce que vous attendez. Ils sont utilisés pour
faire des mathématiques. Vous pouvez les utiliser pour les quatre opérations
principales (plus, moins, multiplier et diviser) ainsi que pour trouver un
module (le reste après une division) et pour incrémenter ou décrémenter une
valeur (voir Tableau 3-1).

Tableau 3-1. Opérateurs arithmétiques

Description de l'opérateur Exemple

+ Une addition $j+1


− Soustraction $j−6

* Multiplication $j*11

/ Division $j/4

% Module (reste de division) $j%9

++ Incrément ++$j

−− Décrémenter −−$j

Opérateurs d'affectation
Ces opérateurs sont utilisés pour affecter des valeurs aux variables. Ils
commencent par le trèssimple = et passer à +=, −=, et ainsi de suite (voirTableau
3-2). L'opérateur += ajoute la valeur de droite à la variable de gauche, au lieu de
remplacer totalement la valeur de gauche. Ainsi, si $count commence par la
valeur 5, l'instruction :

$compte += 1 ;

définit $count sur 6, tout comme l'instruction d'affectation la plus familière :

$compte = $compte + 1 ;

Les chaînes ont leur propre opérateur, le point (.), détaillé dans la
sectionConcaténation de chaînes.

Tableau 3-2. Opérateurs d'affectation

Opérateur Exemple Équivalent à

= $j=15 $j = 15

+= $j+=5 $j = $j + 5

−= $j−=3 $j = $j − 3

*= $j*=8 $j = $j * 8

/= $j /= 16 $j = $j / 16

.= $j .= k $j = $j . k $
$
%= $j%=4 $j= $j % 4

Opérateurs de comparaison
Les opérateurs de comparaison sont généralement utilisés dans une
construction telle qu'une instruction if dans laquelle vous devez comparer deux
éléments. Par exemple, vous pouvez souhaiter savoir si une variable que vous
avez incrémentée a atteint une valeur spécifique, ou si une autre variable est
inférieure à une valeur définie, et ainsi de suite (voir
Tableau 3-3).
Notez la différence entre = et ==. Le premier est un opérateur d'affectation et le
second est un opérateur de comparaison. Même les programmeurs plus avancés
peuvent parfois transposer les deux lorsqu'ils codent à la hâte, alors soyez
prudent.

Tableau 3-3. Opérateurs de comparaison

Opérateu La description Exemple


r

== Est égal à $j == 4

!= N'est pas égal à $j!=21

> Est supérieur à $j>3

< Est inférieur à $j<100

>= Est supérieur àou égalpour $j>=15

<= Est inférieur ou égal à $j<=8

Opérateurs logiques
Si vous ne les avez jamais utilisés auparavant, les opérateurs logiques
peuvent sembler un peu intimidants à première vue. Mais pensez-y
simplement comme vous utiliseriez la logique en anglais. Par exemple, vous
pourriez vous dire : « s'il est plus tard que 12 h et avant 14 h, alors déjeunez
». En PHP, le code pour cela pourrait ressembler à ceci (en utilisant l'heure
militaire) :

si ($heure > 12&& $heure < 14) dolunch();


Ici, nous avons déplacé l'ensemble des instructions pour réellement aller
déjeuner dansnous
fonction que un devrons créer plus tard appelée dolunch. Le alors de
l'énoncé est omis, car il est sous-entendu et donc inutile.
Comme l'exemple précédentmontre, vous utilisez généralement un opérateur
logique pour combiner les résultats de deux des opérateurs de comparaison
présentés dans la section précédente. Un opérateur logique peut également être
entré dans un autre opérateur logique ("Si l'heure est postérieure à 12h00 et
antérieure à 14h00, ou si l'odeur d'un rôti imprègne lecouloir et il y a des
assiettes sur la table »). En règle générale, si quelque chose a une valeur VRAI ou
FAUX, il peut être entré dans un opérateur logique. Un opérateur logique prend
deux entrées vrai ou faux et produit un résultat vrai ou faux.
Tableau 3-4montre les opérateurs logiques.

Tableau 3-4. Opérateurs logiques

Opérateu La description Exemple


r

&& Et $j == 3&&$k == 2

et Faible priorité et $j == 3et$k == 2

|| Ou $j < 5||$j > 10

ou Faible priorité ou $j < 5ou$j > 10

! Pas ! ($j==k $)

xor Exclusifou $jxork $

Notez que && est généralement interchangeable avec et ; il en est de même pour
|| et ou. Mais et et ou ont une priorité inférieure, donc dans certains cas, vous
aurez peut-être besoin de parenthèses supplémentaires pour forcer la priorité
requise. D'autre part, il y a des moments où seul et ou ou est acceptable, comme
dans l'instruction suivante, qui utilise un opérateur ou (à expliquer dansChapitre
10):

mysql_select_db($base de données) ou mourir("Impossiblepour sélectionner la base de données");

Le plus inhabituel de ces opérateurs est xor, qui signifie exclusif ou etrenvoie
une valeur TRUE si l'une des valeurs est TRUE, mais une valeur FALSE si les
deux entrées sont
VRAI ou les deux entrées sont FAUX. Pour comprendre cela, imaginez
que vous vouliez
concoctez votre propre nettoyant pour les articles ménagers. L'ammoniac faitun
bon nettoyant, tout comme l'eau de javel, vous voulez donc que votre nettoyant
en ait un. Mais lele nettoyant ne doit pas avoir les deux, car la combinaison est
dangereuse. En PHP, vous pourriez représenter ceci comme :

$ingrédient= $ammoniaque xou $eau de Javel ;

jentileexemplesmamelon,jeFeitson$ammoniune
ou$bleachjesVRAI,$ingrédienttsera également défini sur TRUE. Mais si les
deux sont TRUE ou les deux sont FALSE, $ingredient sera défini sur FALSE.

Affectation variable
La syntaxe pour attribuer une valeur à une variable est toujours variable =
valeur. Ou, pour réaffecter la valeur à une autre variable, c'est autre variable =
variable.
Il existe également quelques autres opérateurs d'affectation qui vous seront
utiles. Par exemple, nous avons déjà vu :

$x += 10 ;

qui indique à l'analyseur PHP d'ajouter la valeur de droite (dans ce cas, la valeur
10) à la variable $x. De même, nous pourrions soustraire comme suit :

$y −= 10;

Incrémentation et décrémentation variables


Ajouter ou soustraire 1 est une opération si courante que PHP fournit des
opérateurs spéciaux pour cela. Vous pouvez utiliser l'un des éléments suivants à la
place des opérateurs += et −= :

++$x ;
−−$y ;

En conjonction avec un test (une instruction if), vous pouvez utiliserle code suivant :
si (++$x == 10) echo
$x ;

Cela indique à PHP d'incrémenter d'abord la valeur de $x puis de tester s'il a la


valeur 10 ; si c'est le cas, affichez sa valeur. Mais vous pouvez également
demander à PHP d'incrémenter (ou, dans l'exemple suivant, de décrémenter) une
variable après avoir testé la valeur, comme ceci :

si ($y−− == 0) echo $y;

ce qui donne un résultat légèrement différent. Supposons que $y commence par 0


avant l'exécution de l'instruction. La comparaison renverra un résultat VRAI, mais
$y sera défini sur -1 une fois la comparaison effectuée. Alors, qu'est-ce que
l'instruction echo affichera : 0 ou -1 ? Essayez de deviner, puis essayez
l'instruction dans un processeur PHP pour confirmer. Étant donné que cette
combinaison d'instructions prête à confusion, elle doit être considérée comme un
simple exemple pédagogique et non comme un guide pour un bon style de
programmation.
En bref, si une variable est incrémentéeou décrémenté avant ou après le test
dépend du fait que l'opérateur d'incrémentation ou de décrémentation est placé
avant ou après la variable.
Soit dit en passant, la bonne réponse à la question précédente est que
l'echoaffichera le résultat −1, car $y a été décrémenté juste après son accès dans
l'instruction if et avant l'instruction echo.

Concaténation de chaînes
La concaténation de chaînes utilise le point (.) pour ajouter une chaîne de
caractères à une autre. La façon la plus simple de procéder est la suivante :

echo"Vous avez " . $msgs . " messages.";

Culumingtchapeautil variable$msgsjessettotil évaluer5,til sortirenomtle sienline


de code sera:

Toiavoir 5 messages.

Tout comme vous pouvez ajouter une valeur à une variable numérique avec
l'opérateur +=, vous pouvez ajouter une chaîne à une autre en utilisant .= comme
ceci :
$bulletin.= $flash
d'information ;

jentle sienCas,jeF$bulletinccontient une nouvelles bulletinunend$newsflash a une


flash d'information, la commande ajoute le flash d'information au bulletin
d'information afin que
$bulletin comprend maintenant les deux chaînes de texte.

Types de chaîne
PHP prend en charge deux types de chaînes qui sont désignées par le type de
guillemets que vous utilisez. Si vous souhaitez attribuer une chaîne littérale, en
préservant le contenu exact, vous devez utiliser le guillemet simple (apostrophe)
comme ceci :

$info= 'Variables de préface avec un $ comme ceci : $variable';

Dans ce cas, chaque caractère de la chaîne entre guillemets simples est affecté
à $info. Si vous aviez utilisé des guillemets doubles, PHP aurait tenté d'évaluer
$variable en tant que variable.
D'autre part, lorsque vous souhaitez inclure la valeur d'une variable dans une
chaîne, vous le faites en utilisant des chaînes entre guillemets :

echo« Cette semaine, $count personnes ont consulté votre profil » ;

Comme vous le constaterez, cette syntaxe offre également une forme plus
simple de concaténation dans laquelle vous n'avez pas besoin d'utiliser un
point, ou de fermer et rouvrir des guillemets, pour ajouter une chaîne à une
autre. C'est ce qu'on appelle la substitution de variables, et vous remarquerez
que certaines applications l'utilisent beaucoup et que d'autres ne l'utilisent pas
du tout.

Caractères d'échappement
Parfois, une chaîne doit contenir des caractèresavec des significations
particulières qui pourraient être mal interprétées. Par exemple, la ligne de code
suivante ne fonctionnera pas, car le deuxième guillemet rencontré dans
l'orthographe du mot indiqueral'analyseur PHP que la fin de la chaîne a été
atteinte. Par conséquent, le reste de la ligne sera rejeté comme une erreur :

$texte= 'L'atroshus de mon orthographe'; // Syntaxe erronée


$bulletin.= $flash
d'information
Pour ;
corriger cela, vous pouvez ajouter une barre oblique inverse juste avant la citation
incriminée
marque pour indiquer à PHP de traiter le caractère littéralement et de ne pas l'interpréter :

$texte= 'Mon orthographe est toujours atroshus';

Et vous pouvez exécuter cette astuce dans presque toutes les situations dans
lesquelles PHP renverrait autrement une erreur en essayant d'interpréter un
caractère. Par exemple, la chaîne suivante entre guillemets doubles sera
correctement affectée :

$text = "Elle a écrit dessus, \"Retourner à l'expéditeur\".";

De plus, vouspeut utiliser des caractères d'échappement pour insérer divers


caractères spéciaux dans des chaînes telles que des tabulations, des retours à la
ligne et des retours chariot. Ceux-ci sont représentés, comme vous pouvez le
deviner, par \t, \n et \r. Voici un exemple utilisant des onglets pour mettre en
page un titre ; il est inclus ici simplement pour illustrer les échappements, car
dans les pages Web, il existe toujours de meilleures façons de faire la mise en
page :

$titre= "Date\tNom\tPaiement" ;

Ces caractères spéciaux précédés d'une barre oblique inverse ne fonctionnent que
dans les chaînes entre guillemets doubles. Dans les chaînes entre guillemets
simples, la chaîne précédente serait affichée avec le ugly
\t séquences au lieu de tabulations. Dans les chaînes entre
guillemets simples, seules l'apostrophe échappée (\') et la barre
oblique inverse échappée elle-même (\\) sont reconnues comme
caractères échappés.

Commandes multilignes
Il y a des moments où vous avez besoin de sortir beaucoup de texte à partir de
PHP, et l'utilisation de plusieurs instructions d'echo (ou d'impression) prendrait
du temps et serait compliquée. Pour surmonter cela, PHP offre deux commodités.
La première consiste simplement à mettre plusieurs lignes entre guillemets,
comme dansExemple 3-6. Des variables peuvent également être affectées,
comme dansExemple 3-7.
Exemple 3-6. Une instruction d'echo de chaîne multiligne
<?php
$auteur= "Steve Ballmer" ;

echo« Développeurs, développeurs, développeurs, développeurs,


développeurs, développeurs, développeurs, développeurs, développeurs !
- $auteur.";
?>

Exemple 3-7. Une affectation de chaîne multiligne


<?php
$auteur= "Bill Gates" ;

$texte= "Mesurer la progression de la programmation par lignes de code


revient à mesurer la progression de la construction d'un avion en fonction
du poids.

- $auteur.";
?>

PHP propose également une séquence multiligne utilisant l'opérateur <<< -


communément appelé here-document ou heredoc - comme moyen de spécifier un
littéral de chaîne, en préservant les sauts de ligne et autres espaces (y compris
l'indentation) dans le texte. Son utilisation est visible dansExemple 3-8.
Exemple 3-8. Instruction d'echo multiligne alternative
<?php
$auteur= "Brian W. Kernighan" ;

echo <<<_END
Débogageest deux fois plus difficile que d'écrire le code en premier lieu. Par
conséquent, si vous écrivez le code aussi intelligemment que possible, vous
n'êtes, par définition, pas assez intelligent pour le déboguer.

- $auteur.
_FINIR;
?>

Ce code indique à PHP de sortir tout ce qui se trouve entre les deux balises _END
comme s'il s'agissait d'une chaîne entre guillemets (sauf que les guillemets dans
un heredoc n'ont pas besoin d'être échappés). Cela signifie qu'il est possible, par
exemple, pour un développeur d'écrire des sections entières de HTML directement
dans le code PHP, puis de remplacer simplement des parties dynamiques
spécifiques par des variables PHP.
Il est important de se rappeler que la fermeture _END ; La balise doit apparaître
juste au début d'une nouvelle ligne et elle doit être la seule chose sur cette ligne -
même un commentaire n'est pas autorisé à être ajouté après (ni même un seul
espace). Une fois que vous avez fermé un bloc multiligne, vous êtes libre d'utiliser
à nouveau le même nom de balise.
REMARQUE
N'oubliez pas : utilisez le <<<_END ... _END ; construction heredoc, vous n'avez pas besoin
d'ajouter des caractères de saut de ligne \n pour envoyer un saut de ligne - appuyez simplement
sur Retour et commencez une nouvelle ligne. De plus, contrairement à une chaîne délimitée par
des guillemets doubles ou simples, vous êtes libre d'utiliser tous les guillemets simples et
doubles que vous aimez dans un heredoc, sans les échapper en les faisant précéder d'une barre
oblique (\).

Exemple 3-9montre comment utiliser la même syntaxe pour affecter plusieurs


lignes à une variable.
Exemple 3-9. Une affectation de variable de chaîne multiligne
<?php
$auteur= "Scott Adams" ;

$out = <<<_END
Normalles gens croient que si ce n'est pas cassé, ne le répare pas. Les
ingénieurs pensent que s'il n'est pas cassé, il n'a pas encore assez de
fonctionnalités.

- $auteur.
_FINIR;
?>

La variable $out sera alors renseignée avec le contenu entre les deux balises. Si
vous ajoutiez plutôt que d'attribuer, vous auriez également pu utiliser .= à la place
de = pour ajouter la chaîne à $out.
Veillez à ne pas placer de point-virgule directement après la première occurrence
de _END, car cela mettrait fin au bloc multiligne avant même qu'il n'ait commencé
et provoquerait un message d'erreur d'analyse. Le seul endroit pour le point-virgule
est après la balise de fin _END, bien qu'il soit prudent d'utiliser des points-virgules
dans le bloc comme caractères de texte normaux.
Soit dit en passant, la balise _END est simplement celle que j'ai choisie pour ces
exemples car il est peu probable qu'elle soit utilisée ailleurs dans le code PHP et
qu'elle est donc unique. Mais vous pouvez utiliser n'importe quelle balise que vous
aimez, comme _SECTION1 ou _OUTPUT et ainsi de suite. De plus, pour aider à
différencier les balises telles que celle-ci des variables ou des fonctions, la pratique
générale consiste à les faire précéder d'un trait de soulignement, mais vous n'êtes
pas obligé d'en utiliser un si vous choisissez de ne pas le faire.
REMARQUE
Disposer du texte sur plusieurs lignes n'est généralement qu'une commodité pour rendre votre
code PHP plus facile à lire, car une fois qu'il est affiché dans une page Web, les règles de
formatage HTML prennent le relais et les espaces sont supprimés (mais $author est toujours
remplacé par la valeur de la variable ).
Ainsi, par exemple, si vous chargez ces exemples de sortie multiligne dans un navigateur, ils
ne s'afficheront pas sur plusieurs lignes, car tous les navigateurs traitent les retours à la ligne
comme des espaces. Cependant, si vous utilisez la fonction de source d'affichage du
navigateur, vous constaterez que les retours à la ligne sont correctement placés et que la sortie
apparaît sur plusieurs lignes.

Saisie des variables


PHP est un langage très faiblement typé. Cela signifie que les variables n'ont pas
besoin d'être déclarées avant d'être utilisées, et que PHP convertit toujours les
variables dans le type requis par leur contexte lorsqu'elles sont accédées.
Par exemple, vous pouvez créer un nombre à plusieurs chiffres et en extraire le
nième chiffre simplement en supposant qu'il s'agit d'une chaîne. Dans l'extrait
de code suivant, les nombres 12345 et 67890 sont multipliés ensemble,
renvoyant un résultat de 838102050,wquijestpoule misjentil
variable$nombre,unesscommentjen
Exemple3-10.
Exemple 3-10. Conversion automatique d'un nombre en une chaîne
<?php
$nombre= 12345 * 67890 ;
echosubstr($nombre, 3, 1);
?>

UNEttil indiquer detilassigouvernement,$nombrerjes une numérique


variable.BUtah autilsecondesur la ligne suivante, un appel est placé à la fonction
PHP substr, qui demande qu'un caractère
soitrettournéenom$nombre,commencerngunettilFourth position(souviens-
toiberingtchapeaupHDécalages PStartenomzéroo).Jo faistle
sien,pHPturnes$nombrerjento une chaîne de neuf caractères, afin que substr
puisse y accéder et renvoyer le caractère, qui dans ce cas est 1.
Il en va de même pour transformer une chaîne en nombre, etc. DansExemple
3-11,la variable $pi est définie sur une valeur de chaîne, qui est ensuite
automatiquement transformée en un nombre à virgule flottante dans la troisième
ligne par l'équation de calcul de l'aire d'un cercle, qui génère la valeur
78,5398175.
Exemple 3-1 . Automatiquementconvertir une chaîne en nombre
<?php
$pi = "3.1415927" ;
$rayon = 5 ;
echo $pi * ($rayon * $rayon);
?>

En pratique, tout cela signifie que vous n'avez pas trop à vous soucier devos
types de variables. Attribuez-leur simplement des valeurs qui ont du sens pour
vous et PHP les convertira si nécessaire. Ensuite, lorsque vous souhaitez récupérer
des valeurs, il vous suffit de les demander (par exemple, avec une instruction
echo).

Constantes
Constantessont similaires aux variables, contenant des informations auxquelles
il sera possible d'accéder plus tard, sauf qu'elles sont ce à quoi elles
ressemblent - constantes. En d'autres termes, une fois que vous en avez défini
un, sa valeur est fixée pour le reste du programme et ne peut pas être modifiée.
Un exemple d'utilisation d'une constante pourrait être de contenir
l'emplacement de votre serveurracine(le dossier avec les fichiers principaux de
votre site web). Vous définiriez une telle constante comme ceci:

définir("LOCATION_RACINE","usrlocal/www/");

Ensuite, pour lire le contenu de la variable, il suffit de s'y référer comme une
variable normale (mais elle n'est pas précédée du signe dollar) :

répertoire $= ROOT_LOCATION ;

Désormais, chaque fois que vous devez exécuter votre code PHP sur un serveur
différent avec une configuration de dossier différente, vous n'avez qu'une seule
ligne de code à modifier.

REMARQUE
Les deux principales choses que vous devez retenir à propos des constantes sont qu'elles ne
doivent pas être précédées d'un $ (comme avec les variables régulières) et que vous ne pouvez
les définir qu'en utilisant la fonction de définition.
Il est généralement considéré comme une bonne pratique d'utiliser
uniquement
noms des majuscules
de variables, surtout sipour les personnes liront également votre code.
d'autres

Constantes prédéfinies
PHP est livré prêt à l'emploi avec des dizaines de constantes prédéfinies que vous
n'utiliserez généralement pas en tant que débutant en PHP. Cependant, il y en a
quelques-unes, connues sous le nom de constantes magiques, qui vous seront
utiles. Les noms des constantes magiques ont toujours deux traits de soulignement
au début et deux à la fin, de sorte que vous n'essayez pas accidentellement de
nommer l'une de vos propres constantes avec un nom déjà pris. Ils sont détaillés
dansTableau 3-5. Les concepts mentionnés dans le tableau seront introduits
dans les chapitres suivants.

Tableau 3-5. Les constantes magiques de PHP

la magie
constant La description

LIGNE Jilcactuelline numéro detilfichier.

Le chemin d'accès complet et le nom de fichier du fichier. S'il est utilisé à


FICHIER l'intérieur d'une inclusion, le nom dele fichier inclus est renvoyé. En PHP
4.0.2, FICHIER contient toujours un
chemin absolu avec des liens symboliques résolus, alors que dans les
anciennes versions, il pouvait contenir un chemin relatif dans certaines
REP Le répertoire du fichier. S'il est utilisé à l'intérieur d'une inclusion, le
circonstances.
répertoire de l'inclusionfilejesrettourné.Jle sienjeseéquivalentto dirname(
FICHIER ).Json nom de répertoire n'a pas de barre oblique à la fin, sauf s'il s'agit
du répertoire racine. (Ajouté en PHP 5.3.0.)

UNE FONCTION Le nom de la fonction. (Ajouté en PHP 4.3.0.) Depuis PHP 5, renvoie le nom
de la fonction tel qu'il a été déclaré (sensible à la casse). En PHP 4, sa valeur
est toujours en minuscule.

CLASSER Le nom de la classe. (Ajouté en PHP 4.3.0.) Depuis PHP 5, renvoie le nom de la
classe tel qu'il a été déclaré (sensible à la casse). En PHP 4, sa valeur est
toujours en minuscule.

MÉTHODE Le nom de la méthode de classe. (Ajouté en PHP 5.0.0.) Le nom de la méthode


est renvoyé tel qu'il a été déclaré (sensible à la casse).

ESPACE DE NOM Nom de l'espace de noms actuel (sensible à la casse). Ceconstante est
définieau moment de la compilation. (Ajouté en PHP 5.3.0.)
Une utilisation pratique de ces variables est à des fins de débogage, lorsque
vous devez
insérez une ligne de code pour voir si le déroulement du programme l'atteint :

echo"C'est la ligne". LIGNE ." du fichier " . FICHIER ;

Cela entraîne la sortie de la ligne de programme actuelle dans le fichier actuel (y


compris le chemin) en cours d'exécution vers le navigateur Web.

La différence entre les commandes echo et print


Jusqu'à présent, vous avez vu la commande echo utilisée de différentes manières
pour envoyer du texte du serveur à votre navigateur. Dans certains cas, un littéral
de chaîne a été généré. Dans d'autres, les chaînes ont d'abord été concaténées ou
les variables ont été évaluées. J'ai également montré une sortie répartie sur
plusieurs lignes.
Mais il y a aussiune alternative à echo que vous pouvez utiliser : print. Les
deux commandes sont assez similaires, mais print est une construction
semblable à une fonction qui prend unparamètre unique et a une valeur de
retour (qui est toujours 1), alors que echo est purement une construction de
langage PHP. Étant donné que les deux commandes sont des constructions,
aucune ne nécessite l'utilisation de parenthèses.
Dans l'ensemble, la commande echo sera un peu plus rapide que print dans la
sortie texte générale, car elle ne définit pas de valeur de retour. D'autre part,
comme il n'est pas implémenté comme une fonction, echo ne peut pas être utilisé
dans le cadre d'une expression plus complexe, alors que print le peut. Voici un
exemple pour afficher si la valeur d'une variable est TRUE ou FALSE en utilisant
print, quelque chose que vous ne pourriez pas effectuer de la même manière avec
echo, car cela afficherait un message d'erreur Parse :

$b ? imprime "VRAI" : imprime "FAUX" ;

Le point d'interrogation est simplement un moyen d'interroger si la variable $b


est VRAI ou FAUX. La commande située à gauche des deux-points suivants est
exécutée si $b est VRAI, tandis que la commande à droite est exécutée si $b est
FAUX.
En règle générale, cependant, les exemples de ce livre utilisent l'echo, et je
recommande quevous faites de même jusqu'à ce que vous atteigniez un point tel
dans votre développement PHP que vous découvriez la nécessité d'utiliser print.
Les fonctions
Les fonctions sont utilisées pour séparer les sections de code qui exécutent une
tâche particulière. Par exemple, vous avez peut-être souvent besoin de
rechercher une date et de la renvoyer dans un certain format. Ce serait un bon
exemple à transformer en fonction. Le code qui le fait peut ne faire que trois
lignes, mais si vous devez le coller dans votre programme une douzaine de
fois, vous rendez votre programme inutilement volumineux et complexe, à
moins que vous n'utilisiez une fonction. Et si vous décidez de changer le
format des données ultérieurement, le mettre dans une fonction signifie n'avoir
à le changer qu'à un seul endroit.
Le placer dans une fonction raccourcit non seulement votre code source et le
rend plus lisible, mais ajoute également des fonctionnalités supplémentaires
(jeu de mots), car les fonctions peuvent recevoir des paramètres pour les faire
fonctionner différemment. Ils peuvent également renvoyer des valeurs au
code appelant.
Pour créer une fonction, déclarez-la de la manière indiquée dansExemple 3-12.
Exemple 3-12. Une simple déclaration de fonction
<?php
une fonctiondate longue($horodatage)
{
retournerdate("l F jS Y", $horodatage);
}
?>

Cette fonction prend un horodatage Unix(un nombre entier représentant une


date et une heure basées sur le nombre de secondes depuis 00h00 le 1er janvier
1970) comme soninput puis appelle la fonction de date PHP avec la chaîne de
format correcte pour renvoyer une date au format mardi 2 mai 2017. N'importe
quel nombre de paramètres peut être passé entre les parenthèses initiales ; nous
avons choisi d'en accepter un seul. Les accolades entourent tout le code qui est
exécuté lorsque vous appelez ultérieurement la fonction.
Pour afficher la date d'aujourd'hui à l'aide de cette fonction, placez l'appel suivant dans
votre code :

echodate longue(heure());

Jle siencalje les usagestil


intégrépHPTimeFonctiontofetchtilcactuelturienhorodatagepet la transmet à la
nouvelle fonction longdate, qui renvoie ensuite la chaîne appropriée à la
commande echo pour l'affichage. Si vous avez besoin d'imprimer la date 17 jours
auparavant, il ne vous reste plus qu'à émettre l'appel suivant :

echodate longue(heure() - 17 * 24 60 60);

qui passe à l'horodatage Unix actuel moins le nombre de secondes depuis 17 jours
(17 jours × 24 heures × 60 minutes × 60 secondes).
Les fonctions peuvent également accepter plusieurs paramètres et renvoyer plusieurs
résultats,en utilisant des techniques que je développerai dans les chapitres suivants.

Portée variable
Si vous avez un programme très long, il est tout à fait possible que vous
commenciez à courirde bons noms de variables, mais avec PHP, vous pouvez
décider de la portée d'une variable. En d'autres termes, vous pouvez, par exemple,
lui dire que vous voulez que la variable $temp ne soit utilisée qu'à l'intérieur d'une
fonction particulière et oublier qu'elle a déjà été utilisée lorsque la fonction revient.
En fait, il s'agit de la portée par défaut des variables PHP.
Alternativement, vous pouvez informer PHP qu'une variable a une portée globale
et est donc accessible par toutes les autres parties de votre programme.

Variables locales
Variables localessont des variablesqui sont créés à l'intérieur d'une fonction et
ne sont accessibles que par celle-ci. Ce sont généralement des variables
temporaires utilisées pour stocker les résultats partiellement traités avant le
retour de la fonction.
Un ensemble de variables locales est la liste des arguments d'une fonction.
Dans la section précédente,we défini uneFonctiontchapeauaccèspté une
paramètre nommé$horodatage. Cela n'a de sens que dans le corps de la fonction ;
vous ne pouvez pas obtenir ou définir sa valeur en dehors de la fonction.
Pour un autre exemple de variable locale, jetez un autre coup d'œil à la date longue
fonction, quiest légèrement modifié dansExemple 3-13.
Exemple 3-13. Une version étendue de la date longueune fonction
<?php
une fonctiondate longue($horodatage)
{
$ temp= date("l F jS Y", $horodatage);
return "La date est $temp" ;
}
?>

Ici, nous avons assigné la valeur renvoyée par la fonction date à la variable
temporaire $temp, qui est ensuite insérée dans la chaîne renvoyée par la fonction.
UNEssbientôtunestilFonctionreturnes,til évaluer de$tempjeseffacerré,unesjeFjet
eu jamais été utilisé du tout.
Maintenant, àvoir les effets de la portée variable, regardons un code similaire
dansEexemple 3-14.Sone$temp a étécréerré avant de wecaljetillongdate
fonction.
Exemple 3-14. Cette tentative d'accès$temp dans la fonction longdate echouera
<?php
$ temp= "La date est " ; echo
longue date(heure());

une fonctiondate longue($horodatage)


{
retourner$temp . date("l F jS Y", $horodatage);
}
?>

Hcependant, car$tempWashingtons non pluscréerréesprithintillongdateFonction


nipassé en paramètre, longdate ne peut pas y accéder. Par conséquent, cet extrait
de code affiche uniquement la date, pas le texte précédent. En fait, il affichera
d'abord le message d'erreur Remarque : Variable non définie : temp.
La raison en est que, par défaut, les variables créées dans une fonction sont
locales à cette fonction, et les variables créées en dehors de toute fonction ne
sont accessibles que par du code non fonctionnel.
Quelques pistes de réparationExemple 3-14apparaissent dans les exemples3-15et3-16.
Exemple 3-15. La réécriture pour faire référence à $temp dans sa portée
locale résout le problème
<?php
$ temp= "La date est " ;
echo$temp . date longue(heure());

une fonctiondate longue($horodatage)


{
retournerdate("l F jS Y", $horodatage);
}
?>

Eexemple 3-15 maimetilarbitredepuisto$temp en dehors


detilFonction.Jilarbitrence apparaît dans la même portée où la variable a été
définie.
JilsSolutionjen Eexemple 3-16
passe$temptotillongdateFonctionunesuneneextraargument. longdate le lit dans une
variable temporaire qu'il crée appelée
$text et affiche le résultat souhaité.
Exemple 3-16. Une solution alternative : passer $temp en argument
<?php
$ temp= "La date est " ;
echodate longue($temp, heure());

une fonctiondate longue($texte, $horodatage)


{
retourner$texte . date("l F jS Y", $horodatage);
}
?>

REMARQUE
Oublier la portée d'une variable est une erreur de programmation courante, donc se souvenir
du fonctionnement de la portée de la variable vous aidera à déboguer certains problèmes assez
obscurs. Qu'il suffise de dire qu'à moins que vous n'ayez déclaré une variable autrement, sa
portée est limitée à être locale : soit à la fonction en cours, soit au code en dehors de toute
fonction, selon qu'elle a d'abord été créée ou accédée à l'intérieur ou à l'extérieur d'une
fonction .

Variables globales
Il y a des cas où vous avez besoin qu'une variable ait une portée globale, car
vous voulez que tout votre code puisse y accéder. De plus, certaines données
peuvent être volumineuses et complexes, et vous ne voulez pas continuer à les
transmettre en tant qu'arguments aux fonctions.
Pour déclarer une variable comme ayant une portée globale, utilisez le mot-clé
global. Supposons que vous ayez un moyen de connecter vos utilisateurs à
votre site Web et que vous souhaitiez que tout votre code sache s'il interagit
avec un utilisateur connecté ou un invité. Une façon de procéder consiste à
créer une variable globale telle que $is_logged_in :

global $is_logged_in ;
Maintenant, votre fonction de connexion doit simplement définir cette variable sur
1 lors d'une tentative de connexion réussie ou sur 0 en cas d'échec. Comme la
portée de la variable est globale, chaque ligne de code de votre programme peut y
accéder.
Vous devez cependant utiliser les variables globales avec prudence. Je vous
recommande de les créer uniquement lorsque vous ne pouvez absolument pas
trouver un autre moyen d'obtenir le résultat souhaité. En général, les programmes
divisés en petites parties et les données séparées sont moins bogués et plus faciles
à entretenir. Si vous avez un programme de mille lignes (et un jour vous le ferez)
dans lequel vous découvrez qu'une variable globale a la mauvaise valeur à un
moment donné, combien de temps vous faudra-t-il pour trouver le code qui l'a mal
définie ?
De plus, si vous avez trop de variables globales, vous courez le risque d'utiliser
à nouveau l'un de ces noms localement, ou du moins de penser que vous l'avez
utilisé localement, alors qu'en fait il a déjà été déclaré comme global. Toutes
sortes de bogues étranges peuvent survenir dans de telles situations.

REMARQUE
Parfois j'adopte la convention de faire toutnoms de variables globales en majuscules (tout
comme il est recommandé que les constantes soient en majuscules) afin que je puisse voir
en un coup d'œil la portée d'une variable.

Variables statiques
Dans la rubriqueVariables locales, j'ai mentionné que la valeur de la variable
est effacée lorsque la fonction se termine. Si une fonction s'exécute plusieurs
fois, elle démarre avec une nouvelle copie de la variable et le paramètre
précédent n'a aucun effet.
Voici un cas intéressant. Que se passe-t-il si vous avez une variable locale à
l'intérieur d'une fonction à laquelle vous ne voulez pas que d'autres parties de
votre code aient accès, mais que vous souhaitez également conserver sa valeur
pour le prochain appel de la fonction ? Pourquoi? Peut-être parce que vous
voulez qu'un compteur enregistre le nombre d'appels d'une fonction. La
solution consiste à déclarer une variable statique, comme indiqué dansExemple
3-17.
Exemple 3-17. Une fonction utilisant une variable statique
<?php
test de fonctionnalité()
{
statique $count = 0 ;
echo $compte ;
$compte++ ;
}
?>

Ici, la toute première ligne de test de fonction crée une variable statique appelée
$count et l'initialise à une valeur de 0. La ligne suivante affiche la valeur de la
variable ; le dernier l'incrémente.
La prochaine fois que la fonction est appelée, parce que $count a déjà été déclaré,
la première ligne de la fonction est ignorée. Ensuite, la valeur précédemment
incrémentée de
$count est affiché avant que la variable ne soit à nouveau incrémentée.
Si vous envisagez d'utiliser des variables statiques, vous devez noter que vous
ne pouvez pas affecter le résultat d'une expression dans leurs définitions. Ils ne
peuvent être initialisés qu'avec des valeurs prédéterminées (voirExemple 3-
18).
Exemple 3-18. Déclarations de variables statiques autorisées et non autorisées
<?php
statique$int = 0 ; //Permis
statique$int = 1+2 ; //Non autorisé (produira une erreur d'analyse)
static $int = sqrt(144); // Interdit
?>

Variables superglobales
Depuis PHP 4.1.0, plusieurs variables prédéfinies sont disponibles. Celles-ci sont
appelées variables superglobales, ce qui signifie qu'elles sont fournies par
l'environnement PHP mais sont globales au sein du programme, accessibles
absolument partout.
Ces superglobales contiennent de nombreuses informations utiles sur
leprogramme en cours d'exécution et son environnement (voirTableau 3-6). Ils
sont structurés comme des tableaux associatifs, un sujet abordé dansChapitre 6.

Tableau 3-6. Les variables superglobales de PHP

Superglobal
Nom Contenu

$GLOBAUX Toutes les variables actuellement définies dans la portée globale du script.
leles noms de variables sont les clés du tableau.
$_SERVEU Des informations telles que les en-têtes, les chemins,et les emplacements des
R scripts. Les entrées de ce tableau sont créées par le serveur Web, et il n'y a
aucune garantie que chaque serveur Web fournira tout ou partie de celles-ci.

$_GET Variables transmises au script en cours via la méthode HTTP GET.

$_POST Variables transmises au script en cours via la méthode HTTP POST.

$_FILES Éléments téléchargés dans le script actuel via la méthode HTTP POST.

$_COOKIE Variables passétotilcactuelscript viaHTTPcbiscuits.

$_SESSION Sessiau variablesunedisponibletotilcactuelscript.

$_REQUEST Contenu des informations transmises depuis le navigateur ; par défaut, $_GET,
$_POST et $_COOKIE.

$_ENV Variables passées au script courant via l'environnementméthode.

Tous les superglobaux (à l'exception de $GLOBALS) sont nommés avec un


seul trait de soulignement initial et uniquement des lettres majuscules ; par
conséquent, vous devez éviter de nommer vos propres variables de cette
manière pour éviter toute confusion potentielle.
Pour illustrer comment vous les utilisez, examinons quelques informations que de
nombreux sites utilisent. Parmi les nombreuses informations fournies par les
variables superglobales figure l'URL de la page qui a renvoyé l'utilisateur à la page
Web actuelle. Les informations de cette page de référence sont accessibles comme
suit :

$venu_de= $_SERVER['HTTP_REFERER'] ;

C'est si simple. Oh, et si l'utilisateur est venu directement sur votre page Web, par
exemple en tapant son URL directement dans un navigateur, $came_from sera
défini sur une chaîne vide.

Les superglobaux et la sécurité


Une mise en garde s'impose avant de commencer à utiliser des variables
superglobales, car elles sont souvent utilisées par des pirates essayant de trouver
des exploits pour pénétrer dans votre site Web. Ce qu'ils font, c'est charger
$_POST, $_GET ou d'autres superglobaux avec du code malveillant, comme des
commandes Unix ou MySQL qui peuvent endommager ou afficher des données
sensibles si vous y accédez naïvement.
Par conséquent, vous devez toujours désinfecter les superglobales avantles utiliser.
Une manière to faistle sienjes viatil pHP entité
htmlsFonction.jetconvertitAljecpersonnagesjentoEntités HTML. Par exemple, les
caractères inférieur à et supérieur à (< et >) sont transformés en chaînes < et > de sorte
qu'ils sont rendus inoffensifs, comme le sont tous les guillemets et les barres obliques
inverses, etc.
Par conséquent, une bien meilleure façon d'accéder à $_SERVER (et à d'autres
superglobaux) est :

$venu_de= htmlentities($_SERVER['HTTP_REFERER']);

ATTENTION
Usingtil entités htmlFonctionFousanitisationjesunenje suisimportant entraine toijenuneNew
Yorkcirqueumstance où l'utilisateur ou d'autres données tierces sont traitées pour la sortie, pas
seulement avec des superglobaux.

Ce chapitre vous a fourni une base solide dans l'utilisation de PHP. Dans
Chapitre 4, nous allons commencer à utiliserce que vous avez appris pour créer
des expressions et contrôler le déroulement du programme, en d'autres termes,
faire de la programmation réelle.
Mais avant de continuer, je vous recommande de vous tester avec certaines
(sinon toutes) des questions suivantes pour vous assurer que vous avez bien
digéré le contenu de ce chapitre.

Des questions
1. Quelle balise est utilisée pour que PHP commence à interpréter le code
du programme ? Et quelle est la forme abrégée de la balise ?

2. Quels sont les deux types de balises de commentaire ?

3. Quel caractère doit être placé à la fin de chaque instruction PHP ?

4. Quel symbole est utilisé pour préfacer toutes les variables PHP ?

5. Que peut stocker une variable ?

6. Quelle est la différence entre $variable = 1 et $variable == 1 ?


7. Pourquoi pensez-vous qu'un trait de soulignement est autorisé dans les noms de
variables (par exemple,
$current_user) alors que les traits d'union ne le sont pas (par exemple,
$current-user) ?

8. Les noms de variables sont-ils sensibles à la casse ?

9. Pouvez-vous utiliser des espaces dans les noms de variables ?

10. Comment convertir un type de variable en un autre (par


exemple, une chaîne en nombre) ?

11. Quelle est la différence entre ++$j et $j++ ?

12. Les opérateurs && et et sont-ils interchangeables ?

13. Comment pouvez-vous créer un echo ou une affectation multiligne ?

14. Pouvez-vous redéfinir une constante ?

15. Comment échapper à un guillemet ?

16. Quelle est la différence entre les commandes echo et print ?

17. A quoi servent les fonctions ?

18. Comment rendre une variable accessible à toutes les parties d'un programme
PHP ?

19. Si vous générez des données dans une fonction, quelles sont les
différentes manières de transmettre les données au reste du programme ?

20. Quel est le résultat de la combinaison d'une chaîne avec un nombre ?

VoirChapitre 3 RéponsesdansAnnexe Apour les réponses à ces questions.


Chapitre 4. Expressions et flux de
contrôle en PHP

Le chapitre précédent a introduit plusieurs sujets danspassant que ce chapitre


couvre plus en détail, comme faire des choix (branchement) et créer des
expressions complexes. Dans le chapitre précédent, je voulais me concentrer
sur la syntaxe la plus basiqueet les opérations en PHP, mais je ne pouvais pas
éviter d'aborder des sujets plus avancés.
Maintenant, je peux remplir le contexte dont vous avez besoin pour utiliser
correctement ces puissantes fonctionnalités PHP.
Dans ce chapitre, vousobtiendra une formation approfondie sur le
fonctionnement pratique de la programmation PHP et sur la manière de
contrôler le flux du programme.

Expressions
Commençons par la partie la plus fondamentale de tout langage de programmation :
expressions.
Une expression est une combinaison de valeurs, de variables,les opérateurs et
les fonctions qui aboutissent à une valeur. C'est familier à tous ceux qui ont
suivi des cours d'algèbre au lycée :

y= 3(abs(2X) + 4)

qui en PHP serait :

$y = 3 (abs(2 $x) + 4);

La valeur renvoyée (y ou $y dans ce cas) peut être un nombre, une chaîne ou une
valeur booléenne (du nom de George Boole, mathématicien et philosophe anglais
du XIXe siècle). À présent, vous devriez être familiarisé avec les deux premiers
types de valeur, mais je vais vous expliquer le troisième.
Vrai ou faux?
Une valeur booléenne de base peut être TRUE ou FALSE. Par exemple,
l'expression « 20 > 9 » (20 est supérieur à 9) est VRAI et l'expression « 5 == 6 » (5
est égal à 6) est FAUX. (Vous pouvez combiner des opérations booléennes à l'aide
d'opérateurs tels que AND, OR et XOR, qui sont abordés plus loin dans ce
chapitre.)

REMARQUE
Notez que j'utilise des lettres majuscules pour les noms VRAI et FAUX. En effet, ce sont des
constantes prédéfinies en PHP. Vous pouvez également utiliser les versions en minuscules, si
vous préférez, car elles sont également prédéfinies. En fait, les versions en minuscules sont plus
stables, car PHP ne permet pas de les redéfinir ; les majuscules peuvent être redéfinies, ce que
vous devez garder à l'esprit si vous importez du code tiers.

Exemple 4-1montre quelques expressions simples : les deux que je viens de


mentionner, plus uncouple plus. Pour chaque ligne, il imprime une lettre entre a
et d, suivie de deux-points et du résultat des expressions. La balise <br> est là
pour créer un saut de ligne et ainsi séparer la sortie en quatre lignes en HTML.

REMARQUE
Maintenant que nous sommes pleinement entrés dans l'ère du HTML5 et qu'il n'est plus prévu
que le XHTML remplace le HTML, vous n'avez plus besoin d'utiliser la forme à fermeture
automatique <br /> de la balise <br>, ni aucun élément vide (ceux sans balises fermantes), car le
/ est désormais facultatif. Par conséquent, j'ai choisi d'utiliser le style le plus simple dans ce
livre. Si vous avez déjà créé des balises HTML non vides à fermeture automatique (telles que
<div />), elles ne fonctionneront pas dans HTML5 car le / sera ignoré et vous devrez les
remplacer par, par exemple, <div> . .. </div>. Cependant, vous devez toujours utiliser la forme
<br /> de la syntaxe HTML lorsque vous utilisez XHTML.

Exemple 4-1. Quatre expressions booléennes simples


<?php
echo "a: [" . (20 > 9) . "]<br>" ;
echo "b: [" . (5 == 6) . "]<br>" ;
echo "c: [" . (1 == 0) . "]<br>" ;
echo "d: [" . (1 == 1) . "]<br>" ;
?>

La sortie de ce code est la suivante :


un : [1]
b : []
c : []
j : [1]

Notez que les deux expressions a: et d: évaluent à TRUE, qui a une valeur de 1.
Mais b: et c:, qui évaluent à FALSE, n'affichent aucune valeur, car en PHP la
constante FALSE est définie comme NULL, ou rien. Pour vérifier cela par vous-
même, vous pouvez entrer le code dansExemple 4-2.
Exemple 4-2. Sortie des valeurs TRUE et FALSE
<?php // test2.php
echo "a: [" . VRAI . "]<br>" ;
echo "b: [" . FAUX . "]<br>" ;
?>

qui sortce qui suit:

un : [1]
b : []

Soit dit en passant, dans certaines langues, FALSE peut être défini comme 0 ou
même −1, il vaut donc la peine de vérifier sa définition dans chaque langue.

Littéraux et variables
La forme la plus simple d'une expression est un littéral, qui signifie
simplement quelque chose quievalorisetolui-même,seuhunestil numéro73
outiltring"Bonjour".UNEn expression peut aussi être simplement une variable,
qui évalue la valeur qui lui a été assignée. Ce sont deux types d'expressions, car
elles renvoient une valeur.
Exemple 4-3montre trois littérauxet deux variables, qui renvoient toutes des
valeurs, bien que de types différents.
Exemple 4-3. Littéraux et variables
<?php
$monnom = "Brian" ;
$myage = 37;

echo"une: " . 73 ."<br>" ; // Littéral numérique


echo"b : " . "Bonjour" . "<br>" ; // Chaîne littérale echo
"c: " . FAUX . "<br>" ; // Echo littéral
constant "d: " . $monnom . "<br>" ; // Echo
de variable de chaîne"e : " . $myage
."<br>" ; // Variable numérique
?>

Et, comme vous vous en doutez, vous voyez une valeur de retour de tous ces
éléments à l'exception de c:, qui est évalué à FALSE, ne renvoyant rien dans la
sortie suivante :

un : 73
b :Bonjou
r c:
ré:Brian
e : 37

En conjonction avec les opérateurs, il est possible de créer des expressions plus
complexes qui donnent des résultats utiles.
Lorsque vous combinez des constructions d'affectation ou de flux de contrôle avec
des expressions, le résultat est une instruction.Exemple 4-4montre un de chaque.
Le premier attribue le résultat de l'expression 366 - $day_number à la variable
$days_to_new_year, et le second génère un message convivial uniquement si
l'expression
$days_to_new_year < 30 est évalué à VRAI.
Exemple 4-4. Une expression et une affirmation
<?php
$days_to_new_year= 366 - $jour_numéro ; // Expression

si($days_to_new_year < 30)


{
echo"Pas longtemps maintenant jusqu'au nouvel an" ; //Déclaration
}
?>

Les opérateurs
PHP offre de nombreux opérateurs puissants allant des opérateurs arithmétiques,
de chaîne et logiques à l'affectation, à la comparaison, etc. (voirTableau 4-1).

Tableau 4-1. Types d'opérateurs PHP


Opérateur La description Exemple

Arithmétique Mathématiques de base $a + $b

Déployer Union de tableau $a + $b

Mission Attribuervaleurs $a = $b + 23

Au niveau du bit Manipuler des bitsdans les 12 ^ 9


octets

Comparaison Comparerdeux valeurs $a < $b

Exécution Exécutecontenu des back ticks `ls -al`

Incrémenter/décréme Ajouter ou soustraire 1 $a++


nter

Logique booléen $a et $b

Chaîne de caractères Enchaînement $a . $b

Chaque opérateur prend unnombre différent d'opérandes :


Unaireopérateurs, tels que l'incrémentation ($a++) ounégation (-$a), qui
prennent un seul opérande.

Binaireopérateurs, qui représentent la majeure partie des opérateurs PHP, y


compris l'addition, la soustraction, la multiplication et la division.

Un opérateur ternaire, qui prend la forme ? x : y. Il s'agit d'une instruction


si concise sur une seule ligne qui choisit entre deux expressions, en
fonction du résultat d'une troisième.

Priorité de l'opérateur
Si tous les opérateurs avaient la même priorité, ils seraient traités dans l'ordre
dans lequel ils sont rencontrés. En fait, de nombreux opérateurs ont la même
priorité, alors examinons-en quelques-uns dansExemple 4-5.
Exemple 4-5. Trois expressions équivalentes
1 + 2 + 3 − 4 + 5
2 − 4 + 5 + 3 + 1
5 + 2 − 4 + 1 + 3

Ici, vous verrez que bien que les nombres (et leurs opérateurs précédents) aient
été déplacé, le résultat de chaque expression est la valeur 7, car le plus etles
opérateurs moins ont la même priorité. On peut essayer la même chose avec la
multiplication et la division (voirExemple 4-6).
Exemple 4-6. Trois expressions également équivalentes
1 2 3 / 4 5
2 /4 5 3 1
5 2/4 1 *3

Ici, la valeur résultante est toujours 7,5. Mais les choses changent lorsque nous
mélangeons des opérateurs avec des priorités différentes dans une expression,
comme dansExemple 4-7.
Exemple 4-7. Trois expressions utilisant des opérateurs de priorité mixte
1+2*3-4 5
2-4 5 3 +1
5+2-4+1 3

S'il n'y avait pas de priorité d'opérateur, ces troisles expressions seraient
évaluées à 25, −29 et 12, respectivement. Mais parce que la multiplication et la
division ont priorité sur l'addition et la soustraction, il y a des parenthèses
implicites autour de ces parties des expressions, qui ressembleraient àExemple
4-8s'ils étaient visibles.
Exemple 4-8. Trois expressions montrant des parenthèses implicites
1 + (2 3) − (4 5)
2 − (4 5 3) + 1
5 + 2 - 4 + (1 * 3)

Clairement, PHP doit d'abord évaluer les sous-expressions entre parenthèses pour
dériver les expressions semi-complètes dansExemple 4-9.
Exemple 4-9. Après avoir évalué les sous-expressions entre parenthèses
1 + (6) − (20)
2 − (60) + 1
5 + 2 - 4 + (3)

Les résultats finaux de ces expressions sont respectivement −13, −57 et 6 (assez
différents des résultats de 25, −29 et 12 que nous aurions vus s'il n'y avait pas eu
de priorité des opérateurs).
Bien sûr, vous pouvez remplacer la valeur par défautpriorité des opérateurs en
insérant vos propres parenthèses et en forçant les résultats originaux que nous
aurions vus
il n'y a pas eu de priorité d'opérateur(voirExemple 4-10).
Exemple 4-10. Forcer l'évaluation de gauche à droite
((1 + 2) * 3 - 4) * 5
(2 - 4) 5 3 +1
(5 + 2 - 4 + 1) * 3

Avec les parenthèses correctement insérées, nous voyons maintenant les valeurs
25, -29 et 12, respectivement.
Tableau 4-2liste les opérateurs de PHP par ordre de prioritéde haut en bas.

Tableau 4-2. La priorité des opérateurs PHP (de haut en bas)

Les Taper
opérateurs)

() Parenthèses

++ −− Incrémenter/décrémente
r

! Logique

*/ % Arithmétique

+-. Arithmétique etchaîne


de caractères

<< >> Au niveau du bit

< <= > >= <> Comparaison

== != === !== Comparaison

& Au niveau du bit (et


références)

^ Au niveau du bit

| Au niveau du bit

&& Logique

|| Logique

? : Ternaire

= += −= *= /= .= %= &= != ^= <<= >>= Mission

et Logique
xor Logique

ou Logique

Associativité
Nous avons examiné le traitement des expressions de gauche à droite, sauf
lorsque la priorité des opérateurs est en vigueur. Mais certains opérateurs
nécessitent un traitement de droite à gauche, et cette direction de traitement
s'appelle l'associativité de l'opérateur. Pour certains opérateurs, il n'y a pas
d'associativité.
L'associativité devient importante dans les casdans lequel vous ne forcez pas
explicitement la priorité, vous devez donc connaître les actions par défaut des
opérateurs, comme détaillé dansTableau 4-3, qui répertorie les opérateurs et
leur associativité.

Tableau 4-3. Associativité des opérateurs

Opérateur La description Associativité

CLONER NOUVEAU Créer un nouvel objet Aucun

< <= >= == != === !== <> Comparaison Aucun

! LogiqueNE PAS Droit

~ Au niveau du bitNE PAS Droit

++ −− Incrémentation et Droit
décrémentation

(entier) Convertir en un entier Droit

(double) (flottant) Diffuser surun nombre à Droit


(réel) virgule flottante

(chaîne de Caster sur une chaîne Droit


caractères)

(déployer) Diffuser dans un tableau Droit

(objet) Lancer sur un objet Droit

@ Erreur d'inhibitionrapports Droit

= += −= *= /= Mission Droit

.= %= &= |= ^= <<= >>= Mission Droit

+ Addition et plus unaire La gauche


− Soustraction et négation La gauche

* Multiplication La gauche

/ Division La gauche

% Module La gauche

. Concaténation de chaînes La gauche

<< >> & ^ | Au niveau du bit La gauche

?: Ternaire La gauche

|| && et ou xor Logique La gauche

, Séparateur La gauche

Par exemple, regardons la tâcheopérateur dansExemple 4-11, où trois variables


sont toutes définies sur la valeur 0.
Exemple 4-1 . Une déclaration à affectation multiple
<?php
$niveau= $score = $temps = 0 ;
?>

Cette affectation multiplen'est possible que si la partie la plus à droite de


l'expression est évaluée en premier, puis que le traitement se poursuit de
droite à gauche.

REMARQUE
En tant que débutant en PHP, vous devez éviter les pièges potentiels de l'associativité des
opérateurs en imbriquant toujours vos sous-expressions entre parenthèses pour forcer l'ordre
d'évaluation. Cela aidera également les autres programmeurs qui pourraient avoir à maintenir
votre code à comprendre ce qui se passe.

Opérateurs relationnels
Les opérateurs relationnels testent deux opérandes et renvoient un résultat booléen
VRAI ou FAUX. Il existe trois types d'opérateurs relationnels : égalité,
comparaison et logique.

Égalité
Comme nous l'avons déjà rencontré à quelques reprisesdans ce chapitre,
l'opérateur
est == (deuxd'égalité
signes égal). Il est important de ne pas le confondre avec l'opérateur
d'affectation = (signe égal simple). DansExemple 4-12, la première instruction
attribue une valeur et la seconde teste son égalité.
Exemple 4-12. Affectation d'une valeuret tester l'égalité
<?php
$mois= "mars" ;

si($mois == "Mars") echo "C'est le printemps" ;


?>

Comme vous le voyez, en renvoyant TRUE ou FALSE, l'opérateur d'égalité vous


permet de tester des conditions en utilisant, par exemple, une instruction if. Mais
ce n'est pas tout, car PHP est un langage faiblement typé. Si les deux opérandes
d'une expression d'égalité sont de types différents, PHP les convertira dans le type
qui lui convient le mieux.
Par exemple, toute chaîne entièrement composée de nombres sera convertie
ennombres chaque fois qu'ils sont comparés à un nombre. DansExemple 4-13, $a
et $b sont deux chaînes différentes, et nous nous attendrions donc à ce qu'aucune
des instructions if ne produise un résultat.
Exemple 4-13. Les opérateurs d'égalité et d'identité
<?php
$a = "1000" ;
$b = "+1000" ;

si ($a == $b)echo"1";
si ($a === $b) echo
"2" ;
?>

Cependant, si vous exécutez l'exemple, vous verrez qu'il affiche le nombre 1,ce
qui signifie que la première instruction if est évaluée à TRUE. En effet, les deux
chaînes ont d'abord été converties en nombres et 1000 est la même valeur
numérique que
+1000.
En revanche, la deuxième instruction if utilise l'opérateur d'identité—
troiséquivaut àsignes à la suite, ce qui empêche PHP de convertir
automatiquement les types. $a et $b sont donc comparés comme des chaînes et
sont maintenant différents, donc
rienest sortie.
Comme pour forcer la priorité des opérateurs,chaque fois que vous avez un
doute sur la façon dontPHP convertira les types d'opérandes, vous pouvez utiliser
l'opérateur d'identité pour désactiver ce comportement.
De la même manière que vous pouvez utiliser l'opérateur d'égalité pour tester
l'égalité des opérandes, vous pouvez tester qu'ils ne sont pas égaux en utilisant
!=, l'opérateur d'inégalité.
Jeter un coup d'œil àExemple 4-14, qui est une réécriture deExemple 4-13dans lequel
la
les opérateurs d'égalité et d'identité ont été remplacésavec leurs inverses.
Exemple 4-14. L'inégalité et les opérateurs non identiques
<?php
$a = "1000" ;
$b = "+1000" ;

si ($a != $b) echo "1" ;


si ($a !== $b) echo "2" ;
?>

Et, comme on pouvait s'y attendre, le premiersi l'instruction ne produit pas


le nombre 1,car le code demande si $a et $b ne sont pas égaux numériquement.
Au lieu de cela, il affiche le nombre 2, car la deuxième instruction if
demandesi $a et $b ne sont pas identiques l'un à l'autre dans leurs types
d'opérandes actuels, et la réponse est VRAI ; Ils ne sont pas les mêmes.

Opérateurs de comparaison
À l'aide d'opérateurs de comparaison, vous pouvez tester plus que l'égalité et
l'inégalité. PHP vous donne également > (est supérieur à), < (est inférieur à), >=
(est supérieur ou égal à) et <= (est inférieur ou égal à) pour jouer avec.Exemple 4-
15 montre ces opérateurs en cours d'utilisation.
Exemple 4-15. Les quatre opérateurs de comparaison
<?php
$a = 2 ; $b = 3 ;

si ($a > $b) echo "$a est supérieursupérieur à


$b<br>" ; si ($a < $b) echo "$a est inférieur à
$b<br>" ;
if ($a >= $b) echo "$a est supérieur ou égal à
$b<br>" ; if ($a <= $b) echo "$a est inférieur ou égal
à $b<br>" ;
?>

Dans cet exemple, où $a vaut 2 et $b vaut 3, le résultat suivant est généré :

2est inférieur à 3
2est inférieur ou égal à 3

Essayez cet exemple vous-même, en modifiant les valeurs de $a et $b, pour voir
les résultats. Essayez de les régler sur la même valeur et voyez ce qui se passe.

Opérateurs logiques
Les opérateurs logiques produisent des résultats vrai ou faux, et sont donc
égalementappelés opérateurs booléens. Il y en a quatre (voirTableau 4-4).

Tableau 4-4. Les opérateurs logiques

Opérateur logique Description

ET TRUE si les deux opérandes sont TRUE

OU TRUE si l'un des opérandes est TRUE

XOR VRAI si l'un des deux opérandes estVRAI

NE PAS TRUE si l'opérande est FALSE,ou FAUX si l'opérande est


VRAI

Vous pouvez voir ces opérateurs utilisés dansExemple 4-16. Notez que le ! Le
symbole est requis par PHP à la place du mot NOT. De plus, les opérateurs
peuvent être en minuscules ou en majuscules.
Exemple 4-16. La logiqueopérateurs en cours d'utilisation
<?php
$a = 1 ; $b = 0 ;

echo ($a ET $b) . "<br>" ;


echo ($a ou $b) . "<br>" ;
echo ($a XOR $b) . "<br>" ;
echo !$a .
"<br>" ;
?>

Cet exemple affiche NULL, 1, 1, NULL, ce qui signifie que seuls les deuxième et
troisième
les instructions d'echo sont évaluées comme TRUE. (Rappelez-vous que
NULL - ou rien - représente une valeur de FALSE.) C'est parce que
l'instruction AND nécessite que les deux opérandes soient TRUE si elle
doit renvoyer une valeur de TRUE, tandis que la quatrième instruction
effectue un NOT sur la valeur de $ a, en le faisant passer de TRUE (une
valeur de 1) à FALSE. Si vous souhaitez expérimenter cela, essayez le
code, en donnant à $a et $b des valeurs variables de 1 et 0.

REMARQUE
Lors du codage, n'oubliez pas de garder à l'esprit que AND et OR ont une priorité inférieure à
celle des autres versions des opérateurs, && et ||. Dans les expressions complexes, il peut être
plus sûr d'utiliser && et || Pour cette raison.

L'opérateur OR peut causer des problèmes involontaires dans les instructions if,
car le deuxième opérande ne sera pas évalué si le premier est évalué comme
TRUE. DansExemple 4-17, la fonction getnext ne sera jamais appelée si $fini
vaut 1.
Exemple 4-17. Une instruction utilisant l'opérateur OR
<?php
si ($fini == 1 OU getnext() == 1) sortie ;
?>

Si tu as besoingetnext pour être appelé à chaque instruction if, vous


pouvez réécrire le code comme cela a été fait dansExemple 4-18.
Exemple 4-18. L'instruction "si ... OU"modifié pour assurer l'appel de getnext
<?php
$gn = getsuivant();

si ($fini == 1 OU $gn == 1) sortie ;


?>

Dans ce cas, le code de la fonction getnext sera exécuté et la valeur renvoyée sera
stockée dans $gn avant l'instruction if.

REM
ARQ
UE
Une autre solution consiste simplement à échanger les deux clauses pour s'assurer que getnext est
exécuté, car il apparaîtra alors en premier dans l'expression.

Tableau 4-5montre toutes les variantes possibles de l'utilisation des opérateurs


logiques. Vous devez également noter que !TRUE est égal à FALSE et !FALSE
est égal à TRUE.

Tableau 4-5. Toutes les expressions logiques PHP possibles

Contri Opérateurs et résultat


butio s
ns

une b ET OU XOR

VRAI VRAI VRAI VRAI FAUX

VRAI FAUX FAUX VRAI VRAI

FAUX VRAI FAUX VRAI VRAI

FAUX FAUX FAUX FAUX FAUX

Conditionnels
Les conditions modifient le déroulement du programme.Ils vous permettent de
poser des questions sur certaines choses et de répondre aux réponses que vous
obtenez de différentes manières. Les conditions sontau cœur des pages Web
dynamiques - l'objectif premier de l'utilisation de PHP - car elles permettent de
créer facilement une sortie différente à chaque fois qu'une page est consultée.
Jiciareticitoui de sans bouclecconditionnels :tiljeFétat
moiNT,tilinterrupteurhdéclaration, et le ? opérateur. Par non-boucle, je veux dire
que les actions initiées par l'instruction ont lieu et que le déroulement du
programme se poursuit, tandis que les conditions en boucle (que nous verrons
bientôt) exécutent le code encore et encore jusqu'à ce qu'une condition soit
remplie.

L'instruction if
Une façon de penser au déroulement du programme est de l'imaginer comme
une autoroute à voie unique sur laquelle vous conduisez. C'est à peu près une
ligne droite, mais de temps en temps, vous rencontrez divers panneaux vous
indiquant où aller.
Dans le cas d'une instruction if, vous pouvez imaginertomber sur un panneau
de déviation que vous devez suivre si une certaine condition est VRAIE. Si
c'est le cas, vous démarrez et suivez le détour jusqu'à ce que vous reveniez à
son point de départ, puis continuez sur votrechemin dans votre direction
d'origine. Ou, si la condition n'est pas VRAIE, vous ignorez le détour et continuez
à conduire (voirFigure 4-1).

Illustration 4-1. Le déroulement du programme est


comme une voie uniqueAutoroute

Le contenu de la condition if peut être n'importe quelle expression PHP


valide,y comprisl'égalité, la comparaison, les tests pour 0 et NULL, et même les
valeurs renvoyées par les fonctions (fonctions intégrées ou celles que vous
écrivez).
Les actions à entreprendre lorsqu'une condition if est TRUE sont généralement
placées entre accolades, { }. Cependant, vous pouvez ignorer les accolades si
vous n'avez qu'une seule instruction à exécuter. Mais si vous utilisez toujours des
accolades, vous éviterez d'avoir à rechercher des bogues difficiles à tracer, comme
lorsque vous ajoutez une ligne supplémentaire à une condition et qu'elle n'est pas
évaluée en raison d'un manque d'accolades. (Notez que pour plus d'espace et de
clarté, de nombreux exemples de ce livre ignorent cette suggestion et omettent les
accolades pour les déclarations simples.)
DansExemple 4-19, imaginez que c'est la fin du mois et que toutes vos factures
ont été payées, vous effectuez donc une maintenance de compte bancaire.
Exemple 4-19. Une instruction ifavec des accolades
<?php
si ($bank_balance < 100)
{
$ argent = 1000 ;
$bank_balance+= $argent ;
}
?>

Dans cet exemple, vous vérifiez votre solde pour voir s'il est inférieur à
100 $ (ou quelle que soit votre devise). Si c'est le cas, vous vous payez 1 000 $
et vous l'ajoutez ensuite au solde. (Si seulement gagner de l'argent était aussi
simple !)
Si le solde bancaire est100 $ ou plus, les instructions conditionnelles sont ignorées et
le déroulement du programme passe à la ligne suivante (non illustrée).
Dans ce livre, les accolades ouvertes commencent généralement sur une
nouvelle ligne. Certaines personnes aiment placer la première accolade à droite
de l'expression conditionnelle ; les autrescommencer une nouvelle ligne avec.
L'un ou l'autre de ces éléments convient, car PHP vous permet de définir vos
caractères d'espacement (espaces, sauts de ligne et tabulations) comme vous le
souhaitez.
Cependant, vous trouverez votre code plus facile à lire et à déboguer si vous
indentez chaque niveau de conditions avec une tabulation.

La déclaration d'autre
Parfois, lorsqu'une condition n'est pas VRAIE, vous ne voudrez peut-être pas
continuer immédiatement avec le code du programme principal, mais souhaiterez
peut-être faire autre chose à la place. C'est là qu'intervient l'instruction else. Avec
elle, vous pouvez configurer un deuxième détour sur votre autoroute, comme
dansFigure 4-2.
Illustration 4-2. L'autoroute a maintenant un détour si et un
autre détour

Avec une instruction if ... else, la première instruction conditionnelle est


exécutée si lala condition est VRAIE. Mais si c'est FALSE, le second est exécuté.
L'un des deux choix doit être exécuté. En aucun cas les deux (ou aucun) ne peuvent
être exécutés.Exemple 4-20montre l'utilisation de la structure if ... else.
Exemple 4-20.Une instruction if ... else avec des accolades
<?php
si ($bank_balance < 100)
{
$ argent = 1000 ;
$bank_balance+= $argent ;
}
autre
{
$d'économies += 50 ;
$bank_balance −= 50;
}
?>

Dans cet exemple, maintenant que vous avez vérifié que vous avez 100 $ ou
plus dans lebanque, la déclaration else est exécutée, par laquelle vous placez une
partie de cet argent dans votre compte d'épargne.
Comme avec les instructions if, si votre autre n'a qu'un seul
conditionneldéclaration, vous pouvez choisir de laisser de côté les accolades.
(Cependant, les accolades sont toujours recommandées. Premièrement, elles
facilitent la compréhension du code. Deuxièmement, elles vous permettent
d'ajouter facilement plus d'instructions à la branche ultérieurement.)

La déclaration elseif
Il y a aussi des moments où vousveulent qu'un certain nombre de possibilités
différentes se produisent, basées sur une séquence de conditions. Vous pouvez
y parvenir en utilisant le elseifdéclaration. Comme vous pouvez l'imaginer, c'est
comme une instruction else, sauf que vous placez une autre expression
conditionnelle avant le code conditionnel. Dans
Exemple 4-21, vous pouvez voir une construction if ... elseif ... else complète.
Exemple 4-21. Une instruction if ... elseif ... else avec des accolades
<?php
si ($bank_balance < 100)
{
$ argent = 1000 ;
$bank_balance+= $argent ;
}
elseif ($bank_balance > 200)
{
$d'économies += 100 ;
$bank_balance −= 100;
}
autre
{
$d'économies += 50 ;
$bank_balance −= 50;
}
?>

Dans l'exemple, une instruction elseif a été insérée entre les instructions if et
else. Il vérifie sivotre solde bancaire dépasse 200 $ et, si c'est le cas, décide que
vous pouvez vous permettre d'en économiser 100 $ ce mois-ci.
Bien que je commence à pousser la métaphore un peu trop loin, vous pouvez
imaginer cela comme un ensemble de détours à plusieurs voies (voirFigure 4-
3).

Figure 4-3. L'autoroute avecsi, sinon et sinon détours

REMARQUE
Une instruction else ferme une instruction if ... else ou if ... elseif ... else. Vous pouvez
omettre un else final si ce n'est pas nécessaire, mais vous ne pouvez pas en avoir un
avant un elseif ; vous ne pouvez pas non plus avoir un elseif avant une instruction if.
Vous pouvez avoir autant d'instructions elseif que vous le souhaitez. Mais à
mesure que le nombre d'instructions elseif augmente, vous seriez probablement
mieux avisé d'envisager un commutateurétat moiNTjeFjetajusters ton
Besoins.Nous allonsjejeohunettchapeau suivant.

La déclaration de commutateur
Jilinterrupteurhétat moiNTjes utilejenCassjenwqui une variable outilresultime
deunen expression peut avoir plusieurs valeurs, qui doivent chacune déclencher
une fonction différente.
Par exemple, considérez un système de menu piloté par PHP qui transmet une
seule chaîne au code du menu principal en fonction de ce que l'utilisateur
demande. Disons les optionssont Accueil, À propos, Actualités, Connexion et
Liens, et nous définissons la variable $page sur l'un d'entre eux, en fonction de
l'entrée de l'utilisateur.
Si nous écrivons le code pour cela en utilisant if ... elseif ... else, cela pourrait
ressembler àExemple 4-22.
Exemple 4-22. Une instruction if ... elseif ... sur plusieurs lignes
<?php
si ($page== "Accueil") echo"Vous avez
sélectionné Accueil" ; elseif ($page == "À propos") echo
"Vous avez sélectionné À propos" ; elseif ($page ==
"Actualités") echo"Vous avez sélectionné
Actualités" ; elseif ($page == "Connexion") echo "Vous avez
sélectionné Connexion" ; elseif ($page == "Liens") echo
"Vous avez sélectionné des liens" ;
?>

jeFwe utiliser uneinterrupteurhétat moiNT,tilcodemicombatjeohlike Eexemple 4-23.


Exemple 4-23. Une instruction switch
<?php
changer($page)
{
Cas"Maison":
echo"Vous avez sélectionné
Accueil" ; Pause;
cas "À propos":
echo"Vous avez sélectionné
À propos" ; Pause;
Cas"Nouvelles":
echo"Vous avez sélectionné Actualités" ;
Pause;
cas
"Connexion":
echo "Vous avez
sélectionné Connexion" ;
Pause;
cas "Liens":
echo "Vous avez
sélectionné des liens" ;
Pause;
}
?>

UNEs toiCalifornienvoir,$pagejesmoimentionné seulement une fois


queunettilStart detilinterrupteurhdéclaration. Ensuite, la commande case vérifie
les correspondances. Lorsqu'elle se produit, l'instruction conditionnelle
correspondante est exécutée. Bien sûr, dans un vrai programme, vous auriez du
code ici pour afficher ou accéder à une page, plutôt que de simplement dire à
l'utilisateur ce qui a été sélectionné.

REMARQUE
Esprith changerétat moints, toi fais ne pas utiliserchargneux croisillonsjeà l'intérieur
Casccommandes.jeà la place,tHécommencer par deux-points et se terminer par l'instruction
break. Cependant, la liste complète des cas dans l'instruction switch est entourée d'accolades.

Éclater
jeF toiwishto Pause en dehors detilinterrupteurhétat moiNT car uneccondition
a étérempli, utilisez la commande break. Cette commande indique à PHP de
sortir du commutateur et de passer à l'instruction suivante.
Si vous deviez omettre les commandes break dansExemple 4-23et le cas de Home
évalué comme VRAI, les cinq cas seraient alors exécutés. Ou si $page avait la
valeur News, toutes les commandes de cas à partir de ce moment-là
s'exécuteraient. Ceci est délibéré et permet une programmation avancée, mais en
général, vous devez toujours vous rappeler d'émettre une commande break chaque
fois qu'un ensemble de conditions conditionnelles a fini de s'exécuter. En fait,
omettre l'instruction break est une erreur courante.

Action par défaut


UNEttypiqueréexigencejeninterrupteurhétat mointsjestofauxje arrière au une
défautactiaujeF
aucune des conditions du cas n'est remplie. Par exemple, dans le cas du code de
menu
dansExemple 4-23,vous pouvez ajouter le code dansExemple 4-24juste avant
l'accolade finale.
Exemple 4-24. Une déclaration par défaut à ajouter àExemple 4-23
défaut:
echo"Sélection non reconnue" ;
Pause;

Bien qu'une commande break ne soit pas requise ici car la valeur par défaut est la
sous-instruction finale et que le déroulement du programme se poursuivra
automatiquement jusqu'à l'accolade fermante, si vous décidez de placer
l'instruction par défaut plus haut, une commande break sera certainement
nécessaire pour empêcher le programme découler de tomber dans les déclarations
suivantes. Généralement, la pratique la plus sûre consiste à toujours inclure la
commande break.

Syntaxe alternative
jeF toi préférer, toimamanyrélieutilsapinstchargneux entretoisejen
uneinterrupteurhétat moiNTesprith un seulcOlon,unendtilFinalechargneux
entretoiseesprithunenfin de coursehccommande,unesjenExemple 4-25.
Cependant, cette approche estn'est pas couramment utilisé et n'est mentionné
ici que si vous le rencontrez dans du code tiers.
Exemple 4-25. Syntaxe alternative de l'instruction switch
<?php
changer($page
): cas
"Accueil":
echo"Vous avez sélectionné
Accueil" ; Pause;

// etc...

case "Liens":
echo "Vous avez sélectionné des liens" ;
Pause;
fin de
course ;
?>

Le ? Opérateur
Une façon d'éviter la verbosité des instructions if et else est d'utiliser le plus
opérateur ternaire compact, ?, ce qui est inhabituel en ce qu'il prend trois
opérandes
plutôt que les deux typiques.
Nous avons brièvement rencontré cela danschapitre 3dans la discussion sur la
différence entre les instructions print et echo comme exemple d'un type
d'opérateur qui fonctionne bien avec print mais pas echo.
Le ? L'opérateur reçoit une expression qu'il doit évaluer, ainsi que deux
instructions à exécuter : une lorsque l'expression est évaluée à VRAI, l'autre
lorsqu'elle est évaluée à FAUX.Exemple 4-26montre le code que nous pourrions
utiliser pour écrire un avertissement concernant le niveau de carburant d'une
voiture sur son tableau de bord numérique.
Exemple 4-26. En utilisantla ? opérateur
<?php
echo$carburant <= 1 ? "Fill tank now" : "Il y a assez de carburant" ;
?>

Dans cette instruction, s'il y a un gallon ou moins de carburant (c'est-à-dire si $fuel


est défini sur 1 ou moins), la chaîne Fill tank now est renvoyée à l'instruction echo
précédente.
Otelle aussi,tiltringLà'ssuffisamment de carburant est restitué. Vous pouvez
également affecter la valeur renvoyée dans un ? instruction à une variable
(voirExemple 4-27).
Exemple 4-27. Attribuer un ? conditionnelrésultat à une variable
<?php
$assez = $carburant <= 1 ? FAUX VRAI;
?>

Ici, $enough recevra la valeur TRUE uniquement lorsqu'il y a plus d'un gallon de
carburant ; sinon, la valeur FALSE lui est affectée.
Si vous trouvez le ? déroutant, vous êtes libre de vous en tenir aux instructions
if, mais vous devez vous y familiariser, car vous le verrez dans le code d'autres
personnes. Il peut être difficile à lire, car il mélange souvent plusieurs
occurrences de la même variable. Par exemple, un code tel que le suivant est
assez populaire :

$ économisé= $sauvegardé >= $nouveau ? $sauvé : $nouveau ;

Si vous le démontez soigneusement, vous pouvez comprendre ce que fait ce code :


opérateur ternaire compact, ?, ce qui est inhabituel en ce qu'il prend trois
$sauvé =
opérandes // Définissez la valeur de $saved sur...
$sauvé >= $nouveau // Vérifiez $saved contre $new
? //Oui, la comparaison est vraie...
$ économisé // ... donc assigne la valeur actuelle de $saved
: //Non, la comparaison est fausse...
$nouveau ; //... alors attribuez la valeur de $new

C'est un moyen concis de garder une trace de la plus grande valeur que vous
avez vue en tant quele programme progresse. Vous enregistrez la plus grande
valeur de $saved et la comparez à
$new chaque fois que vous obtenez une nouvelle valeur. Les
programmeurs familiarisés avec le ? l'opérateur trouve cela plus pratique
que les instructions if pour des comparaisons aussi courtes. Lorsqu'il n'est
pas utilisé pour écrire du code compact, il est généralement utilisé pour
prendre une décision en ligne, par exemple lorsque vous testez si une
variable est définie avant de la transmettre à une fonction.

Bouclage
L'un des avantages des ordinateurs est qu'ils peuvent répéter des tâches de
calcul rapidement et inlassablement. Souvent, vous voudrez peut-être qu'un
programme répète la même séquence de code encore et encore jusqu'à ce que
quelque chose se produise, comme un utilisateur saisissant une valeur ou
atteignant une fin naturelle. Les différentes structures de boucle de PHP
fournissent le moyen idéal pour le faire.
Pour imaginer comment cela fonctionne, jetez un oeil àFigure 4-4. C'est à peu
près la même chose que la métaphore de l'autoroute utilisée pour illustrer les
instructions if, sauf que le détour comporte également une section en boucle qui,
une fois qu'un véhicule est entré, ne peut être quittée que dans les bonnes
conditions du programme.
Illustration 4-4. Imaginerune boucle dans le cadre d'un programme
d'aménagement d'autoroute

tandis que les boucles


Transformons le tableau de bord numérique de la voiture enExemple 4-26dans
une boucle quiccontinuellementcdiabletilFuellevelunes toi conduire, en utilisant
unetandis queejeoups(Eexemple 4- 28).
Exemple 4-28. Une boucle while
<?php
$carburant = 10 ;

tandis que($carburant > 1)


{
// Continue de conduire ...
echo"Il y a assez de carburant" ;
}
?>

En fait, vous préférerez peut-être garder un feu vert allumé plutôt que de sortir
du texte, mais le fait est que quelle que soit l'indication positive que vous
souhaitez faire sur le niveau de carburantjes misjeà l'intérieurtiltandis
queejeoups.Bytilfaçon,jeF toitrytle sieneexempleFou vous-même, notez qu'il
continuera à imprimer la chaîne jusqu'à ce que vous cliquiez sur le bouton Arrêter
de votre navigateur.
REMARQUE
Comme pour les instructions if, vous remarquerez que les accolades sont nécessaires pour
contenir les instructions à l'intérieur des instructions while, à moins qu'il n'y en ait qu'une seule.

Fouuneautreeexemple de unetandis queejeoupstchapeau affichetil


12tempsstable,seeExemple 4-29.
Exemple 4-29. Une boucle while à imprimerla table de 12 fois
<?php
$compte = 1 ;

tandis que($compte <= 12)


{
echo"$count fois 12 est " . $compte * 12 . "<br>" ;
++$compte ;
}
?>

Sonetil variable$comptetjesjeinitialiséto une évaluer de 1,tpoule unetandis


queejeoupsjes a commencé avec l'expression comparative $count <= 12. Cette
boucle continuera à s'exécuter jusqu'à ce que la variable soit supérieure à 12. La
sortie de ce code est la suivante :

1fois 12 e 12
s
t
2fois 12 e 24
s
t
3fois 12 e 36
s
t
etbientôt...

À l'intérieur de la boucle, une chaîne est imprimée avec la valeur de $count multipliée par
12. Pour plus de propreté, ceci est également suivi d'une balise <br> pour forcer une
nouvelle ligne. Puis
$count est incrémenté, prêt pour l'accolade finale qui indique à PHP de
revenir au début de la boucle.
À ce stade, $count est à nouveau testé pour voir s'il est supérieur à 12. Ce n'est pas
le cas, mais il a maintenant la valeur 2, et après 11 autres tours de boucle, il aura la
valeur 13. Lorsque cela se produit , le code dans la boucle while est ignoré et
l'exécution passe au code suivant la boucle, qui, dans ce cas, est la fin du
programme.
Si l'instruction ++$count (qui aurait également pu être $count++) n'avait pas
été là, cette boucle serait comme la première de cette section. Cela ne finirait
jamais et seul le résultat de 1 * 12 serait imprimé encore et encore.
Mais il existe une manière beaucoup plus nette d'écrire cette boucle, ce qui, je
pense, vous plaira. Jeter un coup d'œil àExemple 4-30.
Exemple 4-30. Une version abrégée deExemple 4-29
<?php
$compte = 0 ;

tandis que(++$nombre <= 12)


echo"$count fois 12 est " . $compte * 12 . "<br>" ;
?>

Dans cet exemple, il était possible de supprimer l'instruction ++$count de


l'intérieur de la boucle while et de la placer directement dans l'expression
conditionnelle de la boucle. Ce qui se passe maintenant, c'est que PHP rencontre la
variable $count au début de chaque itération de la boucle et, remarquant qu'elle est
précédée de l'opérateur d'incrémentation, incrémente d'abord la variable et ensuite
seulement la compare à la valeur 12. Vous pouvez donc voir que $count doit
maintenant être initialisé à 0, et non à 1, car il est incrémenté dès que la boucle est
entrée. Si vous gardez l'initialisation à 1, seuls les résultats entre 2 et 12 seront
sortis.

faire ... tandis que les boucles


UNEslicombat variationtotiltandis queejeoupsjestilréo... boucle while, utilisée
lorsque vous souhaitez qu'un bloc de code soit exécuté au moins une fois
et rendu conditionnel uniquement après cela.Exemple 4-31montre une
version modifiée du code pour la table de 12 fois qui utilise une telle boucle.
Exemple 4-31. Une boucle do...whilepour imprimer la table de multiplication pour 12

<?php
$compte =
1 ; fais
echo"$count fois 12 est " . $compte * 12 . "<br>" ; tandis
que (++$count <= 12);
?>

Remarquez comment nous revenons à initialiser $count à 1 (plutôt que 0) parce que le
le code est exécuté immédiatement, sans possibilité d'incrémentationla
variable. A part ça, cependant,le code semble assez similaire.
OFcla nôtre,jeF toi avoirmmineraithan unesingleétat moiNTjeà l'intérieur uneréo...
tandis que la boucle, n'oubliez pas d'utiliser des accolades, comme
dansExemple 4-32.
Exemple 4-32. ExpansionExemple 4-31pourutiliser des accolades
<?php
$compte = 1 ;

fais {
echo"$count fois 12 est " . $compte * 12 ; echo
"<br>" ;
}tandis que (++$count <= 12);
?>

pour les boucles


Le dernier type d'instruction de boucle, la boucle for, est également le plus
puissant, car il combine les capacités de configurer des variables lorsque vous
entrez dans la boucle, de tester les conditions lors de l'itération des boucles et de
modifier les variables après chaque itération.
Exemple 4-33montre comment vous pourriez écrire la
multiplicationprogramme de table avec une boucle for.
Exemple 4-33. Sortie de la table de multiplication pour 12 à partir d'une boucle for
<?php
pour ($count = 1 ; $count <= 12 ; ++$count)
echo"$count fois 12 est " . $compte * 12 . "<br>" ;
?>

Vous voyez comment le code entier a été réduit à une seule instruction for
contenant une seule instruction conditionnelle ? Voici ce qui se passe. Chaque
instruction for prend trois paramètres :
Une expression d'initialisation

Une expression conditionnelle

Une expression de modification

Ceux-ci sont séparés par des points-virgules comme ceci : for (expr1 ; expr2 ; expr3).
À
Au début de la première itération de la boucle, l'expression d'initialisation est
exécutée.
Dans le cas du code de table de multiplication, $count est initialisé à la valeur 1.
Ensuite, à chaque tour de boucle, l'expression de condition (dans ce cas, $count
<= 12) est testée et la boucle n'est entrée que si la condition est VRAIE. Enfin, à
la fin de chaque itération, l'expression de modification est exécutée. Dans le cas
du code table de multiplication, la variable $count est incrémentée.
Toute cette structure supprime soigneusement toute exigence de placer les
contrôles d'une boucle dans son corps, la libérant uniquement pour les
instructions que vous souhaitez que la boucle exécute.
N'oubliez pas d'utiliser des accolades avec une boucle for si elle contient plus
d'une instruction, comme dansExemple 4-34.
Exemple 4-34. La boucle for deExemple4-33avec des accolades ajoutées
<?php
pour ($count = 1 ; $count <= 12 ; ++$count)
{
echo"$count fois 12 est " . $compte * 12 ; echo
"<br>" ;
}
?>

Laisser'sccomparerwpouleto utiliserpourrunendtandis
queejeOups.Jilpourrjeoupsjesexplicitement conçu autour d'une valeur unique qui
change régulièrement. Habituellement, vous avez une valeur qui s'incrémente,
comme lorsque vous recevez une liste de choix d'utilisateurs et que vous
souhaitez traiter chaque choix à tour de rôle. Mais vous pouvez transformer la
variable comme bon vous sembleaimer. Une forme plus complexe de l'instruction
for vous permet même d'effectuer plusieurs opérations dans chacun des trois
paramètres :

pour ($i = 1, $j = 1 ; $i + $j < 10 ; $i++ , $j++)


{
// ...
}

C'est compliqué et déconseillé aux utilisateurs novices. La clé est de


distinguer les virgules des points-virgules. Les trois paramètres doivent être
séparéspar des points-virgules. Dans chaque paramètre, plusieurs instructions
peuvent être séparées par des virgules. Ainsi, dans l'exemple précédent, les
premier et troisième paramètres contiennent chacun deux instructions :
$i = 1, $j = 1 // Initialiser $i et $j
$i+ $j < 10 //Condition de résiliation
$i++, $j++ //Modifier $i et $j à la fin de chaque itération

La principale chose à retenir de cet exemple est que vous devez séparer les
trois sections de paramètres par des points-virgules, et non par des virgules
(qui ne doivent être utilisées que pour séparer les instructions dans une section
de paramètres).
So,wpoulejes unetandis queeétat moiNTmmineraiuneappropriéthan
unepourrétat moiNT?Oorsque votre état ne dépend pas d'un simple
changement régulier d'une variable. Par exemple, si vous souhaitez vérifier
une entrée ou une erreur spéciale et terminer la boucle lorsquejet se produit,
utiliser unetandis queeétat moiNT.

Sortir d'une boucle


Jjusteunes toisaw commentto Pause en dehors de uneinterrupteurhétat moiNT,
toiCalifornienalso Pause en dehorsd'une boucle for en utilisant la même
commande break. Cette étape peut être nécessaire lorsque, par exemple, l'une de
vos instructions renvoie une erreur et que la boucle ne peut pas continuer à
s'exécuter en toute sécurité.
Un cas dans lequel cela peut se produire est lorsque l'écriture d'un fichier
renvoie une erreur, peut-être parce que le disque est plein (voirExemple 4-35).
Exemple 4-35. Écrire un fichier en utilisantune boucle for avec piégeage d'erreur
<?php
$fp= fopen("text.txt", 'wb');

pour ($j = 0 ; $j < 100 ; ++$j)


{
$écrit= fwrite($fp, "données");

si($écrit == FAUX) break ;


}

fferme($fp);
?>

C'est le morceau de code le plus compliqué que vous ayez vu jusqu'à présent,
mais vous êtes prêt pour cela. Nous examinerons les commandes de gestion de
fichiers dans un chapitre ultérieur, mais pour l'instant tout ce que vous devez
savoir est que la première ligne ouvre le fichier text.txt pour l'écriture en mode
binaire, puis renvoie un pointeur vers le fichier dans la variable $fp, qui est
utilisé plus tard pour faire
référence au fichier ouvert.
La boucle itère ensuite 100 fois (de 0 à 99) en écrivant les données de la chaîne
dans le fichier. Après chaque écriture, la variable $écrit se voit attribuer une valeur
par la fonction fwrite représentant le nombre de caractères correctement écrits.
Mais s'il y a une erreur, la fonction fwrite affecte la valeur FALSE.
Jil comportement debrefemamankesjetfacileyFoutilcodetocZuttil variable
$écrirentoseewhetherjetjessettoFALSEunesd,jeFso,to Pause en dehors
detiljeoupsto la déclaration suivante fermant le fichier.
Si vous cherchez à améliorer le code, la ligne :

si($écrit == FAUX) break ;

peut être simplifié en utilisant l'opérateur NOT, comme ceci :

si(!$écrit) pause ;

En fait, la paire d'instructions de la boucle interne peut être raccourcie à l'instruction


unique suivante :

si(!fwrite($fp, "données")) break ;

La commande break est encore plus puissante que vous ne le pensez, car si vous
avez du code imbriqué sur plus d'une couche dont vous avez besoin pour sortir,
vous pouvez suivre la commande break avec un nombre pour indiquer le nombre
de niveaux à sortir, comme ce:

pause 2 ;

La déclaration continue
L'instruction continue ressemble un peu à une instruction break, sauf qu'elle
demande à PHP d'arrêter de traiter la boucle en cours et de passer directement à sa
prochaine itération.
Ainsi, au lieu de sortir de toute la boucle, PHP ne sort que de l'itération en cours.
Cette approche peut être utile dans les cas où vous savez que cela ne sert à rien
poursuite de l'exécutiondans la boucle actuelle et que vous souhaitez
économiser
cycles le processeur
ou éviter qu'une erreur ne se produise en passant directement au
suivantitération de la boucle. DansExemple 4-36, une instruction continue est
utilisée pour empêcher l'émission d'une erreur de division par zéro lorsque la
variable $j a la valeur 0.
Exemple 4-36. Intercepter les erreurs de division par zéro à l'aide de continuer
<?php
$j = 10 ;

tandis que($j > −10)


{
$j-- ;

si ($j == 0) continuer ;

echo (10 / $j) . "<br>" ;


}
?>

Pour toutes les valeurs de $j comprises entre 10 et −10, à l'exception de 0, le


résultat du calcul de 10 divisé par $j est affiché. Mais pour le cas particulier où $j
vaut 0, l'instruction continue est émise et l'exécution passe immédiatement à
l'itération suivante de la boucle.

Casting implicite et explicite


PHP est un langage faiblement typé qui vous permet de déclarer une variable et
son type simplement en l'utilisant. Il convertit également automatiquement les
valeurs d'un type à un autre chaque fois que nécessaire. C'est ce qu'on appelle le
casting implicite.
Cependant, il peut y avoir des moments où PHP implicitele casting n'est pas ce
que vous voulez. DansExemple 4-37, notez que les entrées de la division sont
des nombres entiers. Par défaut, PHP convertit la sortie en virgule flottante
afin de pouvoir donner la valeur la plus précise—
4.66récurrent.
Exemple 4-37. Cette expression renvoie un nombre à virgule flottante
<?php
$a = 56 ;
$b = 12 ;
$c = $a / $b ;
echo $c;
?>

Mais que se serait-il passé si nous avions voulu que $c soit un entier à la place ?
Nous pouvons y parvenir de différentes manières, dont l'une consiste à forcer le
résultat de $a/$b à être transtypé en une valeur entière en utilisant le type de
transtypage entier (int), comme ceci :

$c = (entier) ($a / $b);

C'est ce qu'on appelle le casting explicite. Notez qu'afin de s'assurer que la


valeur de l'expression entière est convertie en entier, nous plaçons l'expression
dansparenthèses. Sinon, seule la variable $a aurait été convertie en entier
— un exercice inutile, car la division par $b aurait tout de même renvoyé un
nombre à virgule flottante.

REMARQUE
Vous pouvez convertir explicitement les types indiqués dansTableau 4-6, mais vous pouvez
généralement éviter d'avoir à utiliser un transtypage en appelant l'une des fonctions intégrées de
PHP. Par exemple, pour obtenir une valeur entière, vous pouvez utiliser la fonction intval.
Comme pour certaines autres sections de ce livre, celle-ci est principalement là pour vous aider
à comprendre le code tiers que vous pourriez rencontrer.

Tableau 4-6. Les types de cast de PHP

Type de fonte La description

(entier) (entier) Transformer en entier en supprimant la partie décimale.

(bool) (booléen) Converti en booléen.

(float) (double) (réel) Conversion en un nombre à virgule flottante.

(chaîne de caractères) Cast à une chaîne.

(déployer) Diffuser dans un tableau.

(objet) Lancer sur un objet.

Liaison dynamique PHP


Parce quePHP est un langage de programmation, et la sortie de celui-ci peut
être complètement différente pour chaque utilisateur, il est possible qu'un site
Web entier s'exécute à partir deune seule page Web PHP. Chaque fois que
l'utilisateur clique sur quelque chose, les détails peuvent être renvoyés à la même
page Web, qui décide quoi faire ensuite en fonction des différents cookies et/ou
autres détails de session qu'elle peut avoir stockés.
Bien qu'il soit possible de créer un site Web completde cette façon, ce n'est pas
recommandé, car votre code source grandira et grandira et commencera à
devenir lourd, car il doit tenir compte de toutes les actions possibles qu'un
utilisateur pourrait entreprendre.
Au lieu de cela, il est beaucoup plus judicieux de diviser le développement de
votre site Web en différentes parties. Par exemple, un processus distinct consiste à
s'inscrire à un site Web, ainsi que toutes les vérifications que cela implique pour
valider une adresse e-mail, déterminer si un nom d'utilisateur est déjà pris, etc.
Un deuxième module pourrait bien servir à connecter les utilisateurs avant de les
transférer à la partie principale de votre site Web. Ensuite, vous pourriez avoir un
module de messagerie avec la possibilité pour les utilisateurs de laisser des
commentaires, un module contenant des liens et des informations utiles, un autre
pour permettre le téléchargement d'images, et plus encore.
Tant que vous avez créé un moyen de suivre votre utilisateur via votre site
Web au moyen de cookies ou de variables de session (que nous examinerons
de plus près dans les chapitres suivants), vous pouvez diviser votre site Web en
sections sensibles de code PHP. , chacun autonome, et offrez-vous donc un
avenir beaucoup plus facile en développant chaque nouvelle fonctionnalité et
en maintenant les anciennes.

Liaison dynamique en action


L'une des applications PHP les plus populaires sur le Web aujourd'hui est la
plateforme de blogs WordPress (voirFigure 4-5). Comme unblogueur ou
lecteur de blog, vous ne vous en rendez peut-être pas compte, mais chaque
section principale a sa propre section principale.Le fichier PHP et toute une
série de fonctions génériques partagées ont été placés dans des fichiers séparés qui
sont inclus dans les pages PHP principales si nécessaire.
L'ensemble de la plate-forme est maintenu avecsuivi de session en coulisses, de
sorte que vous sachiez à peine quand vous passez d'une sous-section à une
autre. Ainsi, en tant que développeur Web, si vous souhaitez modifier
WordPress, il est facile de trouver le fichier dont vous avez besoin, de le
modifier, de le tester et de le déboguer sans vous soucier des parties non
connectées du programme.
La prochaine fois que vous utiliserez WordPress, gardez un œil sur la barre
d'adresse de votre navigateur, en particulier si vous gérez un blog, et vous
remarquerez certains des différents fichiers PHP qu'il utilise.

Illustration 4-5. La plateforme de blogs WordPress est écrite en


PHP

Ce chapitre a couvert pas mal de terrain, et maintenant vous devriez être en


mesure decréez vos propres petits programmes PHP. Mais avant de le faire, et
avant de passer au chapitre suivant sur les fonctions et les objets, vous souhaiterez
peut-être tester vos nouvelles connaissances sur les questions suivantes.

Des questions
1. Quelles valeurs sous-jacentes réelles sont représentées par VRAI et FAUX ?
2. Quelles sont les deux formes d'expressions les plus simples ?

3. Quelle est la différence entre les opérateurs unaires, binaires et ternaires ?

4. Quelle est la meilleure façon de forcer votre propre priorité d'opérateur ?

5. Qu'entend-on par opérateurassociativité?

6. Quand utiliseriez-vous l'opérateur === (identité) ?

7. Nommez les trois instructions conditionnellesles types.

8. Quelle commande pouvez-vous utiliser pour ignorer l'itération en


cours d'une boucle et passer à la suivante ?

9. Ohyjes unepourrjeoupsmminerai puissantthan unetandis queejeoups?

10. Haïe faisjeFunendtandis queeétat


mointsjeInterprétercconditionnelexpressions de différents types de
données ?

VoirChapitre 4 RéponsesdansAnnexe Apour les réponses à ces questions.


Chapitre 5. Fonctions et objets PHP

Les exigences de base de tout langage de programmation incluent un endroit


pour stocker des données, un moyen de diriger le flux du programme et
quelques éléments tels queévaluation d'expression, gestion de fichiers et sortie de
texte. PHP a tout cela, plus des outils comme else et elseif pour vous faciliter la
vie. Mais même avec tout cela dans notre boîte à outils, la programmation peut
être maladroite et fastidieuse, surtout si vous devez réécrire des portions de code
très similaires à chaque fois que vous en avez besoin.
C'est là qu'interviennent les fonctions et les objets. Comme vous pouvez le
deviner, une fonction est unensemble d'instructions qui exécutent une fonction
particulière et, éventuellement, renvoient une valeur. Vous pouvez extraire une
section de code que vous avez utilisée plus d'une fois, la placer dans une fonction
et appeler la fonction par son nom lorsque vous voulez le code.
Les fonctions présentent de nombreux avantages par rapport au code en ligne
contigu. Par exemple,elles ou ils:
Impliquez moins de frappe

Réduire la syntaxe et les autres programmationsles erreurs

Diminuer le temps de chargement des fichiers de programme

Réduisez le temps d'exécution, car chaque fonctionest compilé une seule


fois, peu importe la fréquence à laquelle vous l'appelez

Accepter les argumentset peut donc être utilisé pour des cas généraux aussi
bien que spécifiques

Les objets font avancer ce conceptplus loin. Un objet intègre une ou plusieurs
fonctions, et les données qu'elles utilisent, dans une structure unique appelée
classe.
Dans ce chapitre, vous alleztout savoir sur l'utilisation des fonctions, de la définition
et de l'appel
les faire passer des arguments dans les deux sens.Avec ces connaissances à
votre actif, vous commencerez à créer des fonctions et à les utiliser dans vos
propres objets (où elles seront appelées méthodes).

Fonctions PHP
PHP est livré avec des centaines de fonctions intégrées prêtes à l'emploi, ce qui en
fait un langage très riche. Pour utiliser une fonction, appelez-la par son nom. Par
exemple, vous pouvez voir la fonction d'impression en action ici :

print("print est une pseudo-fonction");

Les parenthèses indiquent à PHP que vous faites référence à une fonction. Sinon, il
pense que vous faites référence à une constante. Un avertissement tel que celui-ci
peut s'afficher :

Remarquer:Utilisation d'un fname constant indéfini - supposé 'fname'

Fsuivi partilteXTtringnom de famille, en dessous detilculumptiontchapeau


toimjuste ont voulu mettre une chaîne littérale dans votre code. (Les choses sont
encore plus confuses s'il y ajesactegénéralement unecconstant nomménom de
famille,jenwquicasepHP les usagesces évaluer.)

REMA
RQUE
À proprement parler, l'impression est une pseudo-fonction, communément appelée une
construction. La différence est que vous pouvez omettre les parenthèses, comme suit :
impression"print ne nécessite pas de parenthèses" ;
Vous devez mettre des parenthèses après toutes les autres fonctions que vous appelez, même si
elles sont vides (c'est-à-dire si vous ne transmettez aucun argument à la fonction).

Les fonctions peuvent prendre n'importe quel nombre d'arguments, y compris


zéro. Par exemple, phpinfo, comme illustré ici, affiche de nombreuses
informations sur lel'installation de PHP et ne nécessite aucun argument (le résultat
de l'appel de cette fonction peut être vu dansFigure 5-1):

phpinfo();
REMARQUE
La fonction phpinfo est extrêmement utile pour obtenir des informations sur votre installation
actuelle de PHP, mais ces informations pourraient également être très utiles aux pirates potentiels.
Par conséquent, ne laissez jamais un appel à cette fonction dans un code prêt pour le Web.

Figure 5-1. La sortie de la fonction phpinfo intégrée de


PHP

Certaines des fonctions intégrées qui utilisent un ou plusieurs arguments


apparaissent dansExemple 5-1.
Exemple 5-1. Trois fonctions de chaîne
<?php
echostrrev(" .dlrow olleH"); // Chaîne inversée echo
str_repeat("Hip ", 2); //Répéter la chaîne
echo strtoupper("hooray!"); // Chaîne en majuscule
?>

Cet exemple utilisetrois fonctions de chaîne pour afficher le texte suivant :

Bonjourmonde. Hip Hip Hourra!

Comme vous pouvez le voir, la fonction strrev a inversé l'ordre des caractères
dans la chaîne,str_repeatrétourbétiltring"Salutp" deux fois (comme requis par
un deuxième argument), et strtoupper a converti "hourra!" en majuscule.

Définir une fonction


La syntaxe générale d'une fonction est :

une fonction nom_fonction([paramètre [,...]])


{
// Déclarations
}

Je vais expliquer tous les crochets, au cas où vous les trouveriez confus. La
première ligne de la syntaxe indique que :
Une définition commence par le mot fonction.

Un nom suit, qui doit commencer par une lettre ou un trait de soulignement, suivi d'un
nombre quelconque de lettres, de chiffres ou de traits de soulignement.

Les parenthèses sontobligatoire.

Un ou plusieurs paramètres, séparéspar des virgules, sont facultatifs.

Les noms de fonction ne sont pas sensibles à la casse,afin que toutes les
chaînes suivantes puissent faire référence
àimprimertFonction:IMPRESSION,Impression,unendImpression.
L'accolade ouvrante commence les instructions qui s'exécuteront lorsque vous
appellerez la fonction ; une accolade assortie doit la fermer. Ces déclarations
peuvent inclureune ou plusieurs instructions de retour, qui forcent la fonction à
cesser son exécution et à revenir au code appelant. Si une valeur est attachée à
l'instruction return, le code appelant peut la récupérer, comme nous le verrons
ensuite.
Renvoyer une valeur
Jetons un coup d'œil à une fonction simple pour convertir le nom complet
d'une personne en minuscules, puis mettre en majuscule la première lettre de
chaque nom.
Nous avons déjà vu un exemple de la fonction strtoupper intégrée de PHP dans
Eexemple 5-1.Fou notrecactuelFonction,nous allonsje utilisercescpartie
inférieure,strtolower:

$ abaissé= strtolower("TOUT # de lettres et de ponctuation que vous VOULEZ");echo $lowered;

Le résultat de cette expérience est :

quelconque# de lettres et de ponctuation que vous voulez

Cependant, nous ne voulons pas que les noms soient tous en minuscules ; nous
voulons que la première lettre de chaque nom soit en majuscule. (Nous n'allons
pas traiter des cas subtils tels que Mary-Ann ou Jo-En-Lai pour cet exemple.)
Heureusement, PHP fournit également une fonction ucfirst qui définit le premier
caractère d'une chaîne en majuscule :

$ucfixe= ucfirst("n'importe quel nombre de lettres et ponctuation que vous voulez");echo $ucfixed;

La sortie est :

Quelconque# de lettres et de ponctuation que vous voulez

Nous pouvons maintenant faire notre première partie de la conception du


programme : pour obtenir un mot avec sa lettre initiale en
majuscule,wecaljestrtolower au
unetringpremière,unendtpouleucfirst.JilWashingtonyto fairetle sienjesto nid
unecaljetostrtoloweresprithinucfirst.Laisser'sseewsalut, car il est important de
comprendre l'ordre dans lequel le code est évalué.
Si vous faites un simple appel à la fonction print :

imprimer(5-8);

L'expression 5-8 est évaluée en premier et la sortie est -3. (Comme vous l'avez vu
dans le chapitre précédent, PHP convertit le résultat en une chaîne afin de
l'afficher.) Si l'expression contient une fonction, cette fonction est également
évaluée en premier :
imprimer(abs(5-8));

PHP fait plusieurs choses en exécutant cette courte instruction :


1. Évaluez 5-8 pour produire -3.

2. Utilisez la fonction abs pour transformer -3 en 3.

3. Convertir le résultaten une chaîne et affichez-la à l'aide de la fonction


d'impression.

Tout fonctionne, car PHP évalue chaque élément de l'intérieur. La même procédure est en
cours lorsque nous appelons ce qui suit :

ucfirst(strtolower("tout# de lettres et de ponctuation que vous VOULEZ"))

pHP passe notretringtostrtolowerunendtpouletoucfirst, produire(unesnous'ai déjà


vu quand on jouait avec les fonctions séparément) :

Quelconque# de lettres et de ponctuation que vous voulez

Définissons maintenant une fonction(montré dansExemple 5-2) qui prend trois


noms et met chacun en minuscule avec une majuscule initiale.
Exemple 5-2. Nettoyer un nom complet
<?php
echofix_names("WILLIAM", "henry", "gateS");

une fonctionfix_names($n1, $n2, $n3)


{
$n1= ucfirst(strtolower($n1));
$n2= ucfirst(strtolower($n2));
$n3= ucfirst(strtolower($n3));

retourne $n1 . " " . $n2 . " " . $n3 ;


}
?>

Vous pourriez bien vous retrouver à écrire ce type de code, car les utilisateurs
laissent souvent leur touche de verrouillage des majuscules activée, insèrent
accidentellement des majuscules aux mauvais endroits et oublient même
complètement les majuscules. La sortie de cet exemple est :
WilliamHenri Gates

Retourner un tableau
Nous venons de voir une fonction renvoyant une seule valeur. Il existe également
des moyens d'obtenir plusieurs valeurs à partir d'une fonction.
La première méthode consiste à les renvoyer dans un tableau. Comme vous
l'avez vu danschapitre 3, un tableau est comme un groupe de variables
collées ensemble dans une rangée.Exemple 5-3montre comment vous
pouvez utiliser un tableau pour renvoyer des valeurs de fonction.
Exemple 5-3. Renvoyer plusieurs valeursdans un tableau
<?php
$noms= fix_names("WILLIAM", "henry", "gateS"); echo
$noms[0] . " " . $noms[1] . " " . $noms[2] ;

une fonctionfix_names($n1, $n2, $n3)


{
$n1= ucfirst(strtolower($n1));
$n2= ucfirst(strtolower($n2));
$n3= ucfirst(strtolower($n3));

retour tableau($n1, $n2, $n3);


}
?>

Cette méthode a l'avantage de garder les trois noms séparés, plutôt que de les
concaténer en une seule chaîne, de sorte que vous pouvez vous référer à
n'importe quel utilisateur simplement par son prénom ou son nom, sans avoir à
extraire l'un ou l'autre nom de la chaîne renvoyée.

Passer par référence


En PHP, faire précéder une variable du symbole & indique à l'analyseur de passer
une référence à la valeur de la variable, pas à la valeur elle-même. Ce concept peut
être difficile à comprendre, alors revenons à la métaphore de la boîte d'allumettes
dechapitre 3.
Imaginez qu'au lieu de sortir une feuille de papier d'une boîte d'allumettes, de
la lire, de la recopier sur une autre feuille de papier, de remettre l'original et de
passer la copie à une fonction (ouf !), vous attachez simplement un bout de fil
à la feuille de papier originale et passez une extrémité de celle-ci à la fonction
(voirFigure 5-2).
Figure 5-2. Imaginer une référence comme un fil attaché àune variable

Maintenant, la fonction peut suivre le fil pour trouver les données auxquelles
accéder. Cela évite toute surcharge liée à la création d'une copie de la variable
uniquement pour l'utilisation de la fonction. De plus, la fonction peut
maintenant modifier la valeur de la variable.
Cela signifie que vous pouvez réécrireExemple 5-3pour passer des références à
tous les paramètres, puis la fonction peut les modifier directement
(voirExemple 5-4).
Exemple 5-4. Renvoyer les valeurs d'une fonction par référence
<?php
$a1= "GUILLAUME" ;
$a2 = "henri" ;
$a3 = "porteES" ;

echo $a1 . " " . $a2 . " " . $a3 . "<br>" ;


fix_names($a1,$a2, $a3);
echo $a1 . " " . $a2 . " " . $a3 ;

une fonctionfix_names(&$n1, &$n2, &$n3)


{
$n1= ucfirst(strtolower($n1));
$n2= ucfirst(strtolower($n2));
$n3= ucfirst(strtolower($n3));
}
?>

Plutôt que de passer des chaînes directement à la fonction, vous les affectez d'abord à
variables et imprimez-les pour voir leurs valeurs "avant". Ensuite, vous appelez la
fonction comme avant, mais placez un symbole & devant chaque paramètre, ce qui
indique à PHP de ne transmettre que les références des variables.
Maintenant, les variables $n1, $n2 et $n3 sont attachées à des "threads" qui
conduisent aux valeurs de $a1, $a2 et $a3. En d'autres termes, il existe un
groupe de valeurs, mais deux ensembles de noms de variables sont autorisés à
y accéder.
Jdonc,tilFonctionfix_names seulement atoassiGN Nouveau valeursto$n1,$n2,et
$n3 pour mettre à jour les valeurs de $a1, $a2 et $a3. La sortie de ce code est :

WILLIAMHENRY PORTES
William Henry Gates

Comme vous le voyez, les deux instructions echo utilisent uniquement les valeurs de $a1,
$a2 et
$a3.

ATTENTION
Soyez prudent lorsque vous passez des valeurs par référence. Si vous devez conserver les
valeurs d'origine, faites des copies de vos variables, puis passez les copies par référence.

Retourner des variables globales


Vous pouvez également donner à une fonction l'accès à une variable créée en
externe en la déclarant une variable globale à partir de la fonction. Le mot clé
global suivi dele nom de la variable donne à chaque partie de votre code un
accès complet à celle-ci (voirExemple 5- 5).
Exemple 5-5. Renvoyer des valeurs dans des variables globales
<?php
$a1= "GUILLAUME" ;
$a2 = "henri" ;
$a3 = "porteES" ;

echo $a1 . " " . $a2 . " " . $a3 . "<br>" ;


fix_names();
echo $a1 . " " . $a2 . " " . $a3 ;

une fonctionfix_names()
{
global$a1 ; $a1 = ucfirst(strtolower($a1));
globale $a2 ; $a2 = ucfirst(strtolower($a2));
globale $a3 ; $a3 = ucfirst(strtolower($a3));
}
?>

Maintenant, vous n'avez plus besoin de passer des paramètres à la fonction, et


elle n'a pas à les accepter. Une fois déclarées, ces variables restent globales et
disponibles pour le reste de votre programme, y compris ses fonctions.

REMARQUE
Afin de conserver autant de portée locale que possible, vous devriez essayer de renvoyer des
tableaux ou d'utiliser des variables par association. Sinon, vous commencerez à perdre certains
des avantages des fonctions.

Récapitulatif de la portée variable


Un petit rappel de ce que vous savez dechapitre 3:
Variables localessont accessibles uniquement à partir de la partie de code
où vous les définissez. S'ils se trouvent en dehors d'une fonction, ils sont
accessibles par tout code en dehors des fonctions, des classes, etc. Si une
variable est à l'intérieur d'une fonction, seule cette fonction peut accéder à
la variable et sa valeur est perdue lorsque la fonction revient.

Variables globalessont accessiblesde toutes les parties de votre code.

Variables statiquesne sont accessibles qu'à l'intérieurla fonction qui les a


déclarés mais conservent leur valeur sur plusieurs appels.

Inclure et exiger des fichiers


Au fur et à mesure que vous progressez dans votre utilisation de la
programmation PHP, vous allez probablement commencer à construire une
bibliothèque de fonctions dont vous pensez avoir besoin à nouveau. Vous
commencerez probablement aussi à utiliser des bibliothèques créées par d'autres
programmeurs.
Il n'est pas nécessaire de copier et coller ces fonctions dans votre code. Vous
pouvez les enregistrer dans des fichiers séparés et utiliser des commandes pour les
extraire. Il existe deux types de
commandes pour effectuer cette action : include et require.

La déclaration d'inclusion
En utilisant include, vous pouvez dire à PHP de récupérer un fichier particulier
et de charger tout son contenu. C'est comme si vous colliez le fichier inclus
dans le fichier actuel au point d'insertion.Exemple 5-6montre comment vous
incluriez un fichier appelé library.php.
Exemple 5-6. Inclure un fichier PHP
<?php
inclure "bibliothèque.php" ;

// Votre code va ici


?>

Utiliser include_once
Chaque fois que vous émettez la directive include, elle inclut à nouveau le fichier
demandé, même si vous l'avez déjà inséré. Par exemple, supposons que library.php
contienne de nombreuses fonctions utiles, vous l'incluez donc dans votre fichier,
mais incluez également une autre bibliothèque qui inclut library.php. Grâce à
l'imbrication, vous avez par inadvertance inclus library.php deux fois. Cela
produira des messages d'erreur, car vous essayez de définir plusieurs fois la même
constante ou fonction. Vous devriez donc utiliser include_once à la place
(voirExemple 5-7).
Exemple 5-7. Inclure un fichier PHP une seule fois
<?php
include_once "bibliothèque.php" ;

// Votre code va ici


?>

Ensuite, chaque fois qu'un autre include ou include_once estrencontré, s'il adéjà
été exécuté, il sera complètement ignoré. Pour déterminer si le fichier a déjà été
exécuté, le chemin d'accès absolu au fichier est mis en correspondance une fois
que tous les chemins relatifs ont été résolus et que le fichier est trouvé dans votre
chemin d'inclusion.

REMARQUE
En général, il est probablement préférable de s'en tenir à include_once et d'ignorer l'inclusion de
base
déclaration. De cette façon, vous n'aurez jamais leproblème de fichiers inclus plusieurs fois.

Utilisation de require et require_once


Un problème potentiel avec include et include_once est que PHP ne tentera
d'inclure que le fichier demandé. L'exécution du programme continue même si le
fichier n'est pas trouvé.
Lorsqu'il est absolument essentiel d'inclure un fichier, exigez-le. Pour les mêmes
raisons que j'ai données pour utiliser include_once, je vous recommande
généralement de vous en tenir à require_once chaque fois que vous avez besoin
d'un fichier (voirExemple 5-8).
Exemple 5-8. Exiger un fichier PHP une seule fois
<?php
require_once "bibliothèque.php" ;

// Votre code va ici


?>

Compatibilité des versions PHP


PHP est en cours de développement et il existe plusieurs versions. Si vous avez
besoin de vérifier si une fonction particulière est disponible pour votre code, vous
pouvez utiliser la fonction function_exists, qui vérifie toutes les fonctions
prédéfinies et créées par l'utilisateur.
Eexemple 5-9 cdiableFoutilFonctionarray_combine,wquijessspécifiquetopHP
version 5.
Exemple 5-9. Vérifier l'existence d'une fonction
<?php
si(function_exists("array_combine"))
{
echo "La fonction existe" ;
}
autre
{
echo"La fonction n'existe pas - mieux vaut écrire la nôtre" ;
}
?>
En utilisant un code comme celui-ci, vous pouvez tirer parti des fonctionnalités
des versions plus récentes dePHP et que votre code s'exécute toujours sur des
versions antérieures, tant que vous répliquez toutes les fonctionnalités manquantes.
Vos fonctions peuvent être plus lentes que celles intégrées, mais au moins votre
code sera beaucoup plus portable.
Vous pouvez également utiliser la fonction phpversion pour déterminer sur quelle
version de PHP votre code s'exécute. Le résultat renvoyé ressemblera à ce qui suit,
selon la version :

5.4.21

Objets PHP
De la même manière que les fonctions représentent une énorme augmentation de
la puissance de programmation au cours des premiers jours de l'informatique, où
parfois la meilleure navigation de programme disponible était une instruction
GOTO ou GOSUB très basique, la programmation orientée objet (POO) utilise
les fonctions pour un tout nouveau niveau.
Une fois que vous avez compris comment condenser des morceaux de code
réutilisables en fonctions, il n'est pas si difficile d'envisager de regrouper les
fonctions et leurs données dans des objets.
Prenons un site de réseautage social qui comporte de nombreuses parties. Une
partie gère toutes les fonctions utilisateur ; c'est-à-dire du code permettant aux
nouveaux utilisateurs de s'inscrire et aux utilisateurs existants demodifier leurs
coordonnées. En PHP standard, vous pouvez créer quelques fonctions pour gérer
cela et intégrer des appels à la base de données MySQL pour suivre tous les
utilisateurs.
Imaginez à quel point il serait plus facile de créer un objet pour représenter
l'utilisateur actuel. Pour ce faire, vous pouvez créer une classe, peut-être
appelée User, qui contiendrait tout le code nécessaire à la gestion des
utilisateurs et toutes les variables nécessaires à la manipulation des données au
sein de la classe. Ensuite, chaque fois que vous avez besoin de manipuler unles
données de l'utilisateur, vous pouvez simplement créer un nouvel objet avec la
classe User.
Vous pouvez traiter ce nouvel objet comme s'il s'agissait de l'utilisateur réel.
Par exemple, vous pouvez transmettre à l'objet un nom, un mot de passe et une
adresse e-mail ; lui demander si un tel utilisateur existe déjà ; et, si ce n'est pas
le cas, demandez-lui de créer un nouvel utilisateur avec ces attributs.
Vous pourriez même avoir un objet de messagerie instantanée, ou un pour gérer si
deux utilisateurs sont amis.
Terminologie
Lors de la création d'un programme pour utiliser des objets, vous devez
concevoir un composite de données et de code appelé une classe. Chaque
nouvel objet basé sur cette classe est appelé une instance (ou occurrence) de
cette classe.
Les données associées à un objet sont appelées ses propriétés ; les fonctions
qu'il utilise sont appelées méthodes. En définissant une classe, vous fournissez
les noms de ses propriétés et le code de ses méthodes. VoirFigure 5-3pour une
métaphore de juke-box pour un objet. Considérez les CD qu'il contient dans le
carrousel comme ses propriétés ; la méthode pour les lire consiste à appuyer
sur les boutons du panneau avant. Il y a aussi la fente pour insérer des pièces
(méthode utilisée pour activer l'objet) et le lecteur de disque laser (méthode
utilisée pour récupérer la musique, ou les propriétés, des CD).
Lorsque vous créez des objets, il est préférable d'utiliser l'encapsulation ou
d'écrire une classe de manière à ce que seules ses méthodes puissent être
utilisées pour manipuler ses propriétés. En d'autres termes, vous refusez au
code extérieur l'accès direct à ses données. Les méthodes que vous fournissez
sont appelées l'interface de l'objet.
Cette approche facilite le débogage : vous devez corriger le code défectueux
uniquement au sein d'une classe. De plus, lorsque vous souhaitez mettre à
niveau un programme, si vous avez utilisé une encapsulation appropriée et
conservé la même interface, vous pouvez simplement développer de nouvelles
classes de remplacement, les déboguer entièrement, puis les remplacer par les
anciennes. Si elles ne fonctionnent pas, vous pouvez remplacer les anciennes
pour résoudre immédiatement le problème avant de déboguer davantage les
nouvelles classes.
Une fois que vous avez créé une classe, vous pouvez constater que vous avez
besoin d'une autre classe qui lui ressemble mais pas tout à fait la même. La
chose simple et rapide à faire est de définir une nouvelle classe en utilisant
l'héritage. Lorsque vous faites cela, votre nouvelle classe a toutes les
propriétés de celle dont elle a hérité. La classe d'origine est maintenant
appelée la superclasse, et la nouvelle est la sous-classe (ou classe dérivée).
Figure 5-3. Un juke-box : un bel exemple d'objet autonomect

Dans notre exemple de juke-box, si vous inventez un nouveau juke-box qui


peut play une vidéo avecavec la musique, vous pouvez hériter de toutes les
propriétés et méthodes from l'original jukebox superclass et ajouter de
nouvelles propriétés (vidéos) et nnouvelles méthodes (une lecteur de film).
Un excellent avantage de ce système est que si vous améliorez le spbesoin ou
tout autreaspect de la superclasse, ses sous-classes recevront le même benefit.

Déclarer une classe


Avant de pouvoir utiliserun objet, vous devez définir une classe avec le cmot-
clé lass.Lesdéfinitonsdeclassecontiennentlenomdelaclasse(quiestsensibleàlacasse), ses propriétés,et ses
méthodes.Exemple 5-10définit la classe User avec deuxPropriétés:
$name et $password (indiqués par le mot-clé public—voirPropriété et
Portée de la méthode en PHP 5). Il crée également une nouvelle instance (appelée
$object)
classer. de ce
Exemple 5-10. Déclarer une classe etexaminer un objet
<?php
$object = nouvel
utilisateur ;
print_r($object);

Utilisateur de classe
{
Publique$nom, $mot de passe ;

fonction save_user()
{
echo "Le code d'enregistrement de l'utilisateur va ici" ;
}
}
?>

Ici, j'ai également utilisé une fonction inestimable appelée print_r. Il demande
à PHP deafficher des informations sur une variable sous une forme lisible par
l'homme. Le _r signifie « dans un format lisible par l'homme ». Dans le cas du
nouvel objet $object, il imprime ce qui suit :

UtilisateurObj
et (
[Nom]
=>
[le mot de
passe]=>
)

Cependant,un navigateur compresse tous les espaces blancs, de sorte que la


sortie dans un navigateur est légèrement plus difficile à lire :

UtilisateurObjet ( [nom] => [mot de passe] => )

Dans tous les cas, la sortie indique que $object est un objet défini par l'utilisateur
qui a le nom et le mot de passe des propriétés.

Création d'un objet


Pour créer un objet avec une classe spécifiée, utilisez le mot-clé new, comme ceci : object
=nouvelle Classe. Voici quelques façons dont nous pourrions le
faire :
$object = nouvel utilisateur ;
$ temp =nouvel utilisateur('nom', 'mot de passe');

Sur la première ligne, nous attribuons simplement un objet à la classe User. Dans
le second, nous passons des paramètres à l'appel.
Une classe peut exiger ou interdire des arguments ; il peut également autoriser des
arguments, mais pas les exiger.

Accéder aux objets


Ajoutons quelques lignesplus àExemple 5-10et vérifier les résultats.Exemple
5-11étend le code précédent en définissant les propriétés de l'objet et en
appelant une méthode.
Exemple 5-1 . Créer etinteragir avec un objet
<?php
$object = nouvel utilisateur ;
print_r($object); echo "<br>" ;

$objet->nom ="Joe" ;
$objet->mot de passe=
"monpasse" ; print_r($object);
echo "<br>" ;

$object->save_user();

Utilisateur de classe
{
Publique$nom, $mot de passe ;

fonction save_user()
{
echo "Le code d'enregistrement de l'utilisateur va ici" ;
}
}
?>

UNEs toiCalifornienvoir,tilssyntaxeFouaccèsngunen objets biensjes$objet-


> propriété.Likewise, toicalje unerencontréhotteliketle sien:$objet->méthode().
Ouioussdevrait Remarquetchapeautileexemplepropriétéyunendméthoderé fais ne
pas avoir $signsjendevant eux. Si vous deviez les faire précéder de signes $, le
code ne serait pas
fonctionner, car il essaierait de référencer la valeur à l'intérieur d'une
variable.
expressionPar exemple, le
$object->$property tenterait de rechercher la valeur affectée à une
variable nommée $property (disons que la valeur est la chaîne brown) puis
tenterait de référencer la propriété $object->brown. Si $property n'est pas défini,
une tentative de référence à $object->NULL se produirait et provoquerait une
erreur.
Lorsqu'elle est consultée à l'aide de la fonction Afficher la source d'un navigateur,
la sortie deExemple 5-11est:

UtilisateurObj
et (
[Nom]
=>
[le mot de
passe]=>
)
UtilisateurObj
et (
[Nom] =>Joe
[mot de passe] =>
monpasse
)
Enregistrer le code utilisateur va ici

Encore une fois, print_r montre son utilité en fournissant le contenu de $object
avant et après l'affectation de la propriété. À partir de maintenant, j'omettrai les
instructions print_r, mais si vous travaillez avec ce livre sur votre serveur de
développement, vous pouvez en mettre quelques-unes pour voir exactement ce
qui se passe.
Vous pouvez également voir que le code de la méthode save_user a été exécuté
via l'appel à cette méthode. Il a imprimé la chaîne nous rappelant de créer du
code.

REMARQUE
Vous pouvez placer des fonctions et des définitions de classe n'importe où dans votre code, avant
ou après les instructions qui les utilisent. En règle générale, cependant, il est recommandé de les
placer vers la fin d'un fichier.

Clonage d'objets
Une fois que vous avez créé un objet, il est passé par référence lorsque vous le
fonctionner, car il essaierait de référencer la valeur à l'intérieur d'une
passez enPar
variable. paramètre.
exemple,Dansle la métaphore de la boîte d'allumettes, cela revient à
garder plusieurs fils attachés à un objet stocké dans une boîte d'allumettes, de
sorte que vous puissiez suivre tout fil attaché.
fil pour y accéder.
En d'autres termes, faire des affectations d'objets ne copie pas les objets dans
leurintégralité. Vous verrez comment cela fonctionne dansExemple 5-12, où nous
définissons une classe User très simple sans méthodes et uniquement le nom de la
propriété.
Exemple 5-12. Copier un objet ?
<?php
$objet1 = nouvel utilisateur();
$objet1->nom= "Alice" ;
$objet2 = $objet1 ;
$objet2->nom= "Amy" ;

echo"nom objet1 = " . $objet1->nom . "<br>" ; echo "nom


objet2 = " . $objet2->nom ;

Utilisateur de classe
{
Publique$nom ;
}
?>

Nous'jecréerrétil objet$objet1unendassignétil évaluerAliceetotilnome propriété.


Ensuite, nous créons $object2, en lui attribuant la valeur de $object1,
etattribuez la valeur Amy uniquement à la propriété name de $object2, du moins
c'est ce que nous pourrions penser. Mais ce code affiche ce qui suit :

objet1nom = Amy
objet2 nom = Amy

Que s'est-il passé? $object1 et $object2 font référence au même objet, donc
changer la propriété name de $object2 en Amy définit également cette propriété
pour
$objet1.
Pour éviter cette confusion, vous pouvez utiliser l'opérateur clone, qui crée une
nouvelle instance de la classe et copie les valeurs de propriété de l'instance
d'origine vers la nouvelle instance.Exemple 5-13illustre cet usage.
Exemple 5-13. Cloner un objet
<?php
$objet1 = nouvel utilisateur();
$objet1->nom= "Alice" ;
$objet2 = cloner $object1 ;
$objet2->nom= "Amy" ;

echo"nom objet1 = " . $objet1->nom . "<br>" ; echo "nom


objet2 = " . $objet2->nom ;

Utilisateur de classe
{
Publique$nom ;
}
?>

Voilà ! La sortie de ce code correspond à ce que nous voulions initialement :

objet1nom = Alice objet2


nom = Amy

Constructeurs
Lors de la création d'un nouvel objet, vous pouvez passer une liste d'arguments
à la classe appelée. Celles-ci sont transmises à une méthode spéciale au sein de
la classe, appelée le constructeur, qui initialise diverses propriétés.
Dans le passé, vous donniez normalement à cette méthode le même nom que la
classe, comme dansExemple 5-14.
Exemple 5-14. Création d'une méthode constructeur
<?php
Utilisateur de classe
{
une fonctionUtilisateur($param1, $param2)
{
//Les instructions du constructeur vont
ici public $username = "Guest";
}
}
?>

Cependant, PHP 5 fournit une approche plus logique pour nommer le


constructeur, qui consiste à utiliser la construction du nom de la fonction (c'est-
à-dire, la construction précédée de deux caractères de soulignement), comme
dansExemple 5-15.
Exemple 5-15. Créer une méthode constructeur en PHP 5
<?php
Utilisateur de classe
{
une fonctionconstruction($param1, $param2)
{
//Les instructions du constructeur vont
ici public $username = "Guest";
}
}
?>

Destructeurs PHP 5
Une autre nouveauté de PHP 5 est la possibilité de créer des méthodes de
destruction. Cette capacité est utile lorsque le code a fait la dernière référence à un
objet ou lorsqu'un script atteint la fin.Exemple 5-16montre comment créer une
méthode destructrice.
Exemple 5-16. Créer une méthode de destruction en PHP 5
<?php
Utilisateur de classe
{
fonction détruire()
{
// Le code du destructeur va ici
}
}
?>

Méthodes d'écriture
Comme vous l'avez vu, déclarer une méthode est similaire à déclarer une
fonction, mais il y a quelques différences. Par exemple, les noms de méthode
commençant par un double trait de soulignement ( ) sont réservés et vous ne
devez pas créer ce formulaire.
Vous avez également accès à une variable spéciale appelée $this, qui peut être
utilisée pour accéder aux propriétés de l'objet courant. Pour voir comment cela
fonctionne, jetez un œil àExemple 5-17, qui contient une méthode différente de la
définition de la classe User appelée get_password.
Exemple 5-17.Utiliser la variable $this dans une méthode
<?php
Utilisateur de classe
{
Publique$nom, $mot de passe ;
une fonctionobtenir le mot de passe()
{
retourner$this->mot de passe ;
}
}
?>

get_password utilise la variable $this pour accéder à l'objet courant


etensuiterenvoie la valeur de la propriété password de cet objet. Notez comment
le $ précédent de la propriété $password est omis lorsque nous utilisons
l'opérateur ->. Laisser le $ en place est une erreur typique que vous pouvez
rencontrer, en particulier lorsque vous utilisez cette fonctionnalité pour la
première fois.
Voici comment utiliser la classe définie dansExemple 5-17:

$objet = nouvel utilisateur;


$objet->mot de passe= "secret" ;

echo $object->get_password();

Ce code imprime le mot de passe secret.

Méthodes statiques en PHP 5


Si vous utilisez PHP 5, vous pouvez également définir une méthode comme
statique, ce qui signifie qu'elle est appelée sur une classe et non sur un objet. Une
méthode statique n'a accès à aucune propriété d'objet et est créée et accessible
comme dansExemple 5-18.
Exemple 5-18. Créer et accéder à une méthode statique
<?php
Utilisateur ::pwd_string();

Utilisateur de classe
{
statiquefonction pwd_string()
{
echo"S'il vous plait entrez votre mot de passe";
}
}
?>

Notez comment nous appelons la classe elle-même, avec la méthode statique, en


utilisant un double
deux-points (également connu sous le nom d'opérateur de résolution de
portée), et non ->. Les fonctions statiques sont utiles pour effectuer des actions
relatives à la classe elle-même, mais pas à des instances spécifiques de la
classe. Vous pouvez voir un autre exemple de méthode statique dansExemple
5-21.

REMARQUE
Si vous essayez d'accéder à $this->property ou à d'autres propriétés d'objet à partir d'une
fonction statique, vous recevrez un message d'erreur.

Déclaration de propriétés
Il n'est pas nécessaire de déclarer explicitement les propriétés dans les classes,
car elles peuvent êtredéfini implicitement lors de la première utilisation. Pour
illustrer cela, dansExemple 5-19la classe User n'a ni propriétés ni méthodes mais
est un code légal.
Exemple 5-19. Définir implicitement une propriété
<?php
$objet1 = nouvel utilisateur();
$objet1->nom= "Alice" ;

echo$objet1->nom ;

Utilisateur de classe {}
?>

Jle siencodeccorrectement les sortiestiltringAliceeesprithout une problème,


carpHP implicitement déclaretil variable$object1->nomeFou toi.BUtahtle sien
type de programmation peut conduire à des bogues extrêmement difficiles à
découvrir, car name a été déclaré en dehors de la classe.
Pour vous aider et aider toute autre personne qui maintiendra votre code, je vous
conseille de prendre l'habitude de toujours déclarer explicitement vos propriétés
dans les classes.
Vous serez content de l'avoir fait.
De plus, lorsque vous déclarez une propriété au sein d'une classe, vous pouvez
lui affecter une valeur par défaut. La valeur que vous utilisez doit être une
constante et non le résultat d'une fonction ou d'une expression.Exemple 5-
20montre quelques affectations valides et non valides.
Exemple 5-20. Déclarations de propriété valides et invalides
<?php
essai de classe
{
Publique$nom ="Paul Smith"; // $age
public valide =42; //Valide
Publique$temps =temps(); //Non valide - appelle une
fonction public $score = $level * 2; //Invalide - utilise une
expression
}
?>

Déclaration de constantes
De la même manière que vous pouvez créer une constante globale avec la fonction
de définition, vous pouvez définir des constantes à l'intérieur des classes. La
pratique généralement acceptée consiste à utiliser des lettres majuscules pour les
faire ressortir, comme dansExemple 5-21.
Exemple 5-21. Définir des constantes dans une classe
<?php
Traduire ::lookup();

classe Traduire
{
constanteANGLAIS =
0 ; const ESPAGNOL
= 1; const
FRANÇAIS = 2; const
ALLEMAND = 3 ;
// ...

recherche de fonction statique ()


{
echoauto :: ESPAGNOL;
}
}
?>

Vous pouvez référencer des constantes directement, en utilisant le mot-clé self


et le double-virguleopérateur. Notez que ce code appelle la classe directement,
en utilisant l'opérateur double-point à la ligne 1, sans en créer une instance au
préalable. Comme vous vous en doutez, la valeur imprimée lorsque vous
exécutez ce code est 1.
N'oubliez pas qu'une fois que vous avez défini une constante, vous ne pouvez plus la
modifier.
Portée des propriétés et des méthodes en PHP 5
PHP 5 fournit trois mots-clés pour contrôler la portée des propriétés et des
méthodes :
Publique
Ces propriétés sont les valeurs par défaut lorsque vous déclarez une
variable à l'aide des mots-clés var ou public, ou lorsqu'une variable est
implicitement déclarée la première fois qu'elle est utilisée. Les mots clés
var et public sont interchangeables car,bien qu'obsolète, var est conservé
pour la compatibilité avec les versions précédentes de PHP. Les méthodes sont
supposées être publiques par défaut.

protégé
Ces propriétés et méthodes (membres)ne peut être référencé que par les
méthodes de classe de l'objet et celles de toutes les sous-classes.

privé
Ces membres ne peuvent être référencés quepar méthodes au sein d'une
même classe, et non par sous-classes.

Voici comment décider lequel vous devez utiliser :


Utilisez public lorsque du code extérieur doit accéder à ce membre et que les
classes d'extension doivent également en hériter.

Utilisez protected lorsque le code extérieur ne doit pas accéder à ce membre


mais que les classes d'extension doivent en hériter.

Utilisez privé lorsque le code extérieur ne doit pas accéder à ceLes classes
membres et d'extension ne doivent pas non plus en hériter.

Exemple 5-22illustrel'utilisation de ces mots clés.


Exemple 5-22. Modification de la propriété et de la portée de la méthode
<?php
classerExemple
{
var$nom ="Michael"; // Identique à public mais obsolète
public $age = 23; // Propriété publique
protégé $usercount ; // Propriété protégée
privéfonction admin() // Méthode privée
{
//Le code administrateur va ici
}
}
?>

Propriétés et méthodes statiques


La plupart des données et des méthodes s'appliquent aux instances d'une classe.
Par exemple, dans une classe Utilisateur, vous voulez faire des choses comme
définir le mot de passe d'un utilisateur particulier ou vérifier quand l'utilisateur
a été enregistré. Ces faits et opérations s'appliquent séparément à chaque
utilisateur et utilisent donc des propriétés et des méthodes spécifiques à
l'instance.
Mais de temps en temps vous aurezveulent conserver des données sur une
classe entière. Par exemple, pour signaler le nombre d'utilisateurs enregistrés,
vous stockerez une variable qui s'applique àtoute la classe User. PHP fournit
des propriétés et des méthodes statiques pour ces données.
Comme le montre brièvement dansExemple 5-18, déclarer les membres d'une
classe statique rendaccessibles sans instanciation de la classe. Une propriété
déclarée statique ne peut pas être directement accessible dans une instance d'une
classe, mais une méthode statique le peut.
Exemple 5-23définit une classe appelée Test avec une propriété statique et une
méthode publique.
Exemple 5-23. Définir une classe avec unpropriété statique
<?php
$ temp= nouveau test();

echo"Essai A : " . Test ::$static_property . "<br>" ; echo


"Essai B : " . $temp->get_sp() ."<br>" ;
echo "Essai C : " . $temp->static_property . "<br>" ;

essai de classe
{
statique$static_property = "Je suis statique" ;

fonction get_sp()
{
retourner soi ::$static_property;
}
}
?>
Lorsque vous exécutez ce code, il renvoie le résultat suivant :

TestA : je suis
statique Test B : je
suis statique

Remarquer:Propriété non définie : Test ::$static_property


Test C :

Cet exemple montre que la propriété $static_property peut être directement


référencée à partir de la classe elle-même via l'opérateur deux-points dans le
test A. En outre, Test Bcvieux obtenirces évaluer
parcallingtilget_sprencontréhotte detil objet$ temp, créé à partir de la classe Test.
Mais le test C a echoué, car la propriété statique
$propriété_statiqueyWashingtons ne pasaccèsbletotil objet$ temp.
Notez comment la méthode get_sp accède à $static_property en utilisant le
mot-clé self. C'est ainsi qu'une propriété statique ou une constante est
directement accessible au sein d'une classe.

Héritage
Une fois que vous avez écrit une classe, vous pouvez en dériver des sous-
classes. Cela peut éviter de nombreuses réécritures de code laborieuses : vous
pouvez prendre une classe similaire à celle que vous devez écrire, l'étendre à
une sous-classe et simplement modifier les parties qui sont différentes. Vous y
parvenez en utilisant l'opérateur d'extension.
DansExemple 5-24, la classe Subscriber est déclarée sous-classe deUtilisateur
au moyen de l'opérateur d'extension.
Exemple 5-24. Héritage et extensionune classe
<?php
$objet = nouvel Abonné ;
$objet->nom =" Fred " ;
$objet->mot de passe= "mot de passe" ;
$objet->téléphone = "012 345 6789" ;
$object->email ="fred@bloggs.com" ;
$objet->affichage();

Utilisateur de classe
{
Publique$nom, $mot de passe ;
fonction save_user()
{
echo "Le code d'enregistrement de l'utilisateur va ici" ;
}
}

l'abonné de la classe étend l'utilisateur


{
Publique$téléphone, $email ;

fonction affichage()
{
echo"Nom: " . $this->nom . "<br>" ; echo "Passer
: " . $this->mot de passe . "<br>" ; echo
"Téléphone : " . $this->téléphone . "<br>" ; echo
"Courriel : " . $this->e-mail ;
}
}
?>

La classe User d'origine a deux propriétés, $name et $password, et une méthode


pour enregistrer l'utilisateur actuel dans la base de données. L'abonné étend cette
classe en ajoutant deux propriétés supplémentaires, $phone et $email, et inclut une
méthode d'affichage des propriétés de l'objet actuel à l'aide de la variable $this, qui
fait référence aux valeurs actuelles de l'objet auquel on accède. La sortie de ce
code est :

Nom: Pass
Fred : mot
Téléphoner:012 345 6789
E-mail: fred@bloggs.com

L'opérateur parent
Si vous écrivez une méthode dans une sous-classe portant le même nom que
celle de sa classe parent, ses instructions remplaceront celles de la classe
parent. Parfois ce n'est pas lacomportement que vous voulez et vous devez
accéder à la méthode du parent. Pour ce faire, vous pouvez utiliser l'opérateur
parent, comme dansExemple 5-25.
Exemple 5-25. Surcharger une méthode et utiliser le parentopérateur
<?php
$objet = nouveau Fils ;
$objet->test();
$objet->test2();

papa de classe
{
test de fonctionnalité()
{
echo"[Class Dad] Je suis ton père<br>" ;
}
}

fils de classe prolonge papa


{
test de fonctionnalité()
{
echo"[Class Son] Je suis Luke<br>" ;
}

fonction test2()
{
parent ::test();
}
}
?>

Ce code crée une classe appelée Dad, puis une sous-classe appelée Son qui hérite
de ses propriétés et méthodes, puis remplace la méthode test. Par conséquent,
lorsque la ligne 2 appelle la méthode test, la nouvelle méthode est exécutée. La
seule façon d'exécuter la méthode de test remplacée dans la classe Dad est d'utiliser
l'opérateur parent, comme indiqué dans la fonction test2 de la classe Son. Le code
affiche ce qui suit :

[ClasserFils] je suis Luke


[ClasserPapa] je suis ton père

Si vous souhaitez vous assurer que votre code appelle une méthode de la classe
courante, vous pouvez utiliser le mot-clé self, comme ceci :

self :: method();

Constructeurs de sous-classes
Lorsque vous étendez une classe et déclarez votre propre constructeur, vous devez
être conscient
que PHP n'appellera pas automatiquement la méthode constructeur de la classe
parent. Si vous voulez être certain que tout le code d'initialisation est exécuté, les
sous-classes doivent toujours appeler les constructeurs parents, comme
dansExemple 5-26.
Exemple 5-26. Appel du constructeur de la classe parent
<?php
$objet= nouveau Tigre();

echo"Les tigres ont...<br>" ;


echo "Fourrure : " . $objet-
>fourrure . "<br>" ; echo "Rayures :
" . $objet->rayures ;

classerChat sauvage
{
Publique$fourrure ; // Les chats sauvages ont de la fourrure

fonction construction()
{
$this->fur = "TRUE" ;
}
}

classerTiger étend Wildcat


{
Publique$rayures ; // Les tigres ont des rayures

fonction construction()
{
parent:: construction();// Appeler d'abord le constructeur parent
$this->rayures = "TRUE" ;
}
}
?>

Jle sieneexempletakesuneavantage
dejehéritagejentilttypiquemamanintérieur.JilWildcat classe a créé la
propriété $fur, que nous aimerions réutiliser, nous
créons donc le Tigerclassestojehériter$furunenduneen
pluscréereuneautre biens,$ rayures. Pour vérifier que les deux constructeurs ont
été appelés, le programme affiche ce qui suit :

Tigresavoir...
Fourrure :
VRAI
Rayures :VRAI
Méthodes finales
Lorsque voussouhaitez empêcher une sous-classe de remplacer une méthode
de superclasse, vous pouvez utiliser le mot-clé final.Exemple 5-27montre
montre.
Exemple 5-27. Création d'une méthode finale
<?php
Utilisateur de classe
{
droit d'auteur de la fonction finale()
{
echo"Cette classe a été écrite par Joe Smith" ;
}
}
?>

Une fois que vous aurez digéré le contenu de ce chapitre, vous devriez avoir
une fortesentir ce que PHP peut faire pour vous. Vous devriez être capable
d'utiliser facilement les fonctions et, si vous le souhaitez, d'écrire du code orienté
objet. DansChapitre 6, nous terminerons notre exploration initiale de PHP en
examinant le fonctionnement des tableaux PHP.

Des questions
1. Quel est le principal avantage d'utiliser une fonction ?

2. Combien de valeurs une fonction peut-elle renvoyer ?

3. Quelle est la différence entre accéder à une variable par son nom
et par référence ?

4. Quelle est la signification de la portée en PHP ?

5. Comment intégrer un fichier PHP dans un autre ?

6. En quoi un objet est-il différent d'une fonction ?

7. Comment créez-vous un nouvel objet en PHP ?

8. Quelle syntaxe utiliseriez-vous pour créer une sous-classe à partir d'une classe
existante ?

9. Comment pouvez-vous appeler un morceau de code d'initialisation lorsqu'un


objet est créé ?
10. Pourquoi est-ce une bonne idée de déclarer explicitement des propriétés dans
une classe ?

VoirChapitre 5 RéponsesdansAnnexe Apour les réponses à ces questions.


Chapitre 6. Tableaux PHP

Danschapitre 3, j'ai donné une très brève introduction aux tableaux de PHP,
juste assez pour avoir un petit aperçu de leur puissance. Dans ce chapitre, je
vais vous montrer bien d'autres choses que vous pouvez faire avec les
tableaux, dont certaines (si vous avez déjà utilisé un langage fortement typé
comme le C) peuvent vous surprendre par leur élégance et leur simplicité.
Les tableaux sont un exemple de ce qui a rendu PHP si populaire. Non
seulement ilssuppriment l'ennui d'écrire du code pour traiter des structures de
données complexes, ils offrent également de nombreuses façons d'accéder aux
données tout en restant incroyablement rapides.

Accès de base
Nous avons déjà considéré les tableaux comme s'il s'agissait de grappes de
boîtes d'allumettes collées ensemble. Une autre façon de penser à un tableau
est comme une chaîne de perles, les perles représentant des variables qui
peuvent être numériques, une chaîne ou même d'autres tableaux. Ils sont
comme des cordons de perles, car chaque élément a son propre emplacement
et (à l'exception du premier et du dernier) chacun a d'autres éléments de
chaque côté.
Certains tableaux sont référencés par des indices numériques ; d'autres
autorisent les identifiants alphanumériques. Les fonctions intégrées vous
permettent de les trier, d'ajouter ou de supprimer des sections et de les
parcourir pour gérer chaque élément via un type de boucle spécial. Et en
plaçant un ou plusieurs tableaux dans un autre, vous pouvez créer des tableaux
de deux, trois ou n'importe quel nombre de dimensions.

Tableaux indexés numériquement


Supposons que vous avez étéchargé de créer un site Web simple pour une
entreprise locale de fournitures de bureau et vous travaillez actuellement sur
la section consacrée au papier. Une façon de gérer les différents articles de
stock de cette catégorie seraitpour les placer dans un tableau numérique. Vous
pouvez voir la façon la plus simple de le faire dansExemple 6-1.
Exemple 6-1.Ajouter des éléments à un tableau
<?php
$papier[]= "Copieur" ;
$papier[] = "Jet d'encre" ;
$papier[] = "Laser" ;
$papier[] = "Photo" ;

print_r($papier);
?>

Dans cet exemple, chaque fois que vous affectez une valeur au tableau $paper,
le premier emplacement vide dans ce tableau est utilisé pour stocker la valeur,
et un pointeur interne à PHP est incrémenté pour pointer vers le prochain
emplacement libre, prêt pour de futures insertions . La fonction familière
print_r (qui imprime le contenu d'une variable, d'un tableau ou d'un objet) est
utilisée pour vérifier que le tableau a été correctement rempli. Il imprime ce
qui suit :

Déplo
yer (
[0] => Photocop
ieuse
[1] => Jet
d'e
ncr
e
[2] => Laser
[3] => photo
)

Le code précédent aurait également pu être écrit comme indiqué dansExemple


6-2, où l'emplacement exact de chaque élément dans le tableau est spécifié.
Mais, comme vous pouvez le constater, cette approche nécessite une saisie
supplémentaire et rend votre code plus difficile à maintenir si vous souhaitez
insérer ou supprimer des fournitures du tableau. Donc, à moins que vous ne
souhaitiezspécifiez un ordre différent, il est généralement préférable de
simplement laisser PHP gérer les numéros d'emplacement réels.
Exemple 6-2. Ajouter des éléments à un tableauen utilisant des emplacements
explicites
<?php
$papier[0]= "Copieur" ;
$paper[1] = "Jet d'encre" ;
$papier[2] = "Laser" ;
$papier[3] = "Photo" ;

print_r($papier);
?>
La sortie de ces exemples est identique, mais vous n'êtes pas susceptible d'utiliser
print_r dans un site Web développé, doncExemple6-3montre comment
vous pouvez imprimer les différents types de papier proposés par le site Web à
l'aide d'une boucle for.
Exemple 6-3. Ajouter des éléments à un tableauet les récupérer
<?php
$papier[]= "Copieur" ;
$papier[] = "Jet d'encre" ;
$papier[] = "Laser" ;
$papier[] = "Photo" ;

for ($j = 0 ; $j < 4 ; ++$j)


echo "$j :
$papier[$j]<br>" ;
?>

Cet exemple imprime ce qui suit :

0 :Photocopieuse
1:Jet d'encre
2 : Laser
3 :photo

Jusqu'à présent, vous avez vu plusieurs façons d'ajouter des éléments à un


tableau etune façon de les référencer, mais PHP en offre bien d'autres, sur
lesquelles je reviendrai bientôt. Mais d'abord, nous allons examiner un autre type
de tableau.

Tableaux associatifs
Le suivi des éléments du tableau par index fonctionne très bien, mais peut
nécessiter un travail supplémentaire pour se souvenir de quel numéro fait
référence à quel produit. Cela peut également rendre le code difficile à suivre
pour les autres programmeurs.
C'est là que les tableaux associatifs prennent tout leur sens. En les utilisant,
vous pouvez référencer les éléments d'un tableau par leur nom plutôt que par
leur numéro.Exemple 6-4 développe le code précédent en donnant à chaque
élément du tableau un nom d'identification et une valeur de chaîne plus longue
et plus explicative.
Exemple 6-4. Ajout d'éléments à un tableau associatif et récupérationleur
<?php
$papier['copieur']= "Copieur & Multifonction" ;
$papier['jet d'encre']= "Imprimante à jet d'encre" ;
$papier['laser'] ="Imprimante laser";
$papier['photo'] ="Papier photographique" ;
echo$papier['laser'] ;
?>

Au lieu d'un nombre (qui ne transmet aucune information utile, à part la


position de l'élément dans le tableau), chaque élément a maintenant un nom
unique que vouspeut utiliser pour le référencer ailleurs, comme avec l'instruction
echo, qui imprime simplement Laser Printer. Les noms (copieur, jet d'encre, etc.)
sont appelés index ou clés et les éléments qui leur sont attribués (tels que
"Imprimante laser") sont appelés valeurs.
Ce très puissantfonctionnalité de PHP est souvent utilisée lors de
l'extractioninformations à partir de XML et HTML. Par exemple, un analyseur
HTML tel que ceux utilisés par un moteur de recherche pourrait placer tous les
éléments d'une page Web dans un tableau associatif dont les noms reflètent la
structure de la page :

$html['titre']= "Ma page Web" ;


$html['corps'] ="... corps de la page Web..." ;

Le programme décomposerait également probablement tous les liens trouvés


dans une page dans un autre tableau, et tous les titres et sous-titres dans un
autre. Lorsque vous utilisez des tableaux associatifs plutôt que numériques, le
code faisant référence à tous ces éléments est facile à écrire et à déboguer.

Affectation à l'aide du tableau Keyword


Jusqu'à présent, vous avez vu comment attribuer des valeurs à des tableaux en
ajoutant simplement de nouveaux éléments un par un. Que vous spécifiiez des
clés, que vous spécifiiez des identifiants numériques ou que vous laissiez PHP
affecter implicitement des identifiants numériques, il s'agit d'une approche de
longue haleine. Un plusméthode d'affectation compacte et plus rapide utilise le
mot-clé tableau.Exemple 6-5 affiche à la fois un tableau numérique et un
tableau associatif attribués à l'aide de cette méthode.
Exemple 6-5. Ajout d'éléments àun tableau en utilisant le mot clé array
<?php
$p1= array("Copieur", "Jet d'encre", "Laser", "Photo");

echo"élément p1 : " . $p1[2] . "<br>" ;

$p2= array('copier' => "Copieur & Multifonction",


'inkjet' => "Imprimante à jet d'encre",
'laser' =>"Imprimante
laser", 'photo' =>"Papier
photographique");

echo"élément p2 : " . $p2['jet d'encre'] . "<br>" ;


?>

La première moitié decet extrait attribue les anciennes descriptions de produits


raccourcies au tableau $p1. Il y a quatre objets, ils occuperont donc les
emplacements 0 à 3.
Par conséquent, l'instruction echo imprime ce qui suit :

p1élément : Laser

La seconde moitié attribue des identifiants associatifs et des descriptions de


produits plus longues qui les accompagnent au tableau $p2 en utilisant le format
index => valeur. L'utilisation de => est similaire à l'opérateur d'affectation normal
=, sauf que vous affectez une valeur à un index et non à une variable. L'indice est
alors inextricablement lié à cette valeur, à moins qu'une nouvelle valeur ne lui soit
attribuée. La commande echo affiche donc :

p2élément : imprimante à jet d'encre

Vous pouvez vérifier que $p1 et $p2 sont des types de tableau différents, car les
deux commandes suivantes, lorsqu'elles sont ajoutées au code, provoqueront une
erreur d'index indéfini ou de décalage indéfini, car l'identifiant de tableau pour
chacun est incorrect :

echo$p1['jet d'encre'] ; // Index indéfini


echo $p2[3] ; //Décalage indéfini

Le foreach ... comme boucle


Les créateurs de PHP se sont donné beaucoup de mal pour rendre le langage facile
à utiliser. Ainsi, non content des structures de boucle déjà fournies, ils en ont
ajouté une autre spécialement pour les tableaux : la boucle foreach ... as. En
l'utilisant, vous pouvez parcourir tous les éléments d'un tableau, un à la fois, et
faire quelque chose avec eux.
Le processus commence par le premier élément et se termine par le dernier,
vous n'avez donc même pas besoin de savoir combien d'éléments il y a dans un
tableau.
Exemple 6-6montre comment foreach ... as peut être utilisé pour réécrireExemple 6-3.
Exemple 6-6. Parcourir un tableau numérique en utilisant foreach ... comme
<?php
$papier= array("Copieur", "Jet d'encre", "Laser", "Photo");
$j = 0 ;

foreach($papiercomme $élément)
{
echo"$j : $élément<br>" ;
++$j ;
}
?>

Lorsque PHP rencontre une instruction foreach, il prend le premier élément du


tableau et le place dans la variable suivant le mot-clé as ; et chaque fois que le
flux de contrôle revient au foreach, l'élément de tableau suivant est placé dans le
mot-clé as. Dans ce cas, la variable $item est définie sur chacune des quatre
valeurs tour à tour dans le tableau $paper. Une fois que toutes les valeurs ont été
utilisées, l'exécution de la boucle se termine. La sortie de ce code est exactement
la même queExemple 6-3.
Voyons maintenant comment foreach fonctionne avec un tableau associatif en
examinantExemple 6-7, qui est une réécriture de la seconde moitié deExemple
6-5.
Exemple 6-7. Parcourir un tableau associatif en utilisant foreach ... comme
<?php
$papier= array('copier' => "Copieur & Multifonction",
'inkjet' => "Imprimante à jet d'encre",
'laser' =>"Imprimante laser",
'photo' =>"Papier photographique");

foreach($papieras $élément =>


$description) echo "$élément :
$description<br>" ;
?>

N'oubliez pas que les tableaux associatifs nenécessitent des index numériques, donc la
variable
$j n'est pas utilisé dans cet exemple. Au lieu de cela, chaque élément du
tableau $paper est introduit dans la paire clé/valeur des variables $item
et $description, à partir de laquelle ils sont imprimés. Le résultat affiché
de ce code est le suivant :

photocopieuse:Copieur et jet
d'encre polyvalent :
imprimante à jet d'encre
laser:Imprimante laser
photo : papier
photographique

Comme syntaxe alternative à foreach ... as, vous pouvez utiliser la fonction list en
conjonction avec la fonction each, comme dansExemple 6-8.
Exemple 6-8. Parcourir un tableau associatif en utilisant chacun et liste
<?php
$papier= array('copier' => "Copieur & Multifonction",
'inkjet' => "Imprimante à jet d'encre",
'laser' =>"Imprimante laser",
'photo' =>"Papier photographique");

tandis que(list($item, $description) = each($paper)) echo


"$item : $description<br>" ;
?>

jentle sieneexemple, unetandis queejeoupsjesset en


hautunendvajeccontinuerjeen boucle jusqu'à ce quetileachLa fonction renvoie la
valeur FALSE. La fonction each agit comme foreach : elle renvoie un tableau
contenant une paire clé/valeur du tableau $paper, puis déplace son pointeur
intégré vers la paire suivante dans ce tableau. Lorsqu'il n'y a plus de paires à
renvoyer, chacune renvoie FALSE.
La fonction list prend un tableau comme argument (dans ce cas, la paire
clé/valeurrenvoyé par la fonction each) puis attribue les valeurs du tableau aux
variables listées entre parenthèses.
Vous pouvez voir comment la liste fonctionne un peu plus clairement
dansExemple 6-9, où un tableaujescréerré en dehors
detildeuxotringsAliceeunendBobunendtpoule passétotillistfonction, qui affecte
ces chaînes comme valeurs aux variables $a et $b.
Exemple 6-9. Utilisation de la listeune fonction
<?php
liste($a,$b) = array('Alice', 'Bob');
echo "a=$ab=$b" ;
?>

La sortie de ce code est :

a=Aliceb=Bob
Vous pouvez donc faire votre choix lorsque vous parcourez des tableaux.
Utilisez foreach ... as pour créer une boucle qui extrait les valeurs de la
variable suivant as, ou utilisez la fonction each et créez votre propre système
de bouclage.

Tableaux multidimensionnels
Une fonctionnalité de conception simple dans la syntaxe des tableaux de PHP
permet de créer des tableaux de plus d'une dimension. En fait, ils peuvent avoir
autant de dimensions que vous le souhaitez (bien que ce soit une application rare
qui aille plus loin que trois).
Cette fonctionnalité permet d'inclure un tableau entier dans un autre, et de
pouvoir continuer à le faire, tout comme la vieille rime : « Les grosses puces
ont de petites puces sur le dos pour les mordre. Les petites puces ont des puces
moindres, ajoutez des puces, à l'infini.
Regardons comment cela fonctionne en prenant le tableau associatif de
l'exemple précédent et en l'étendant ; voirExemple 6-10.
Exemple 6-10. Création d'un tableau associatif multidimensionnel
<?php
$produits = array(

'papier'=>

déploy

er(

'photocopieu
se'=> "Copieur & Multifonction", 'jet
d'encre' => "Imprimante à jet d'encre",
'laser' =>"Imprimante laser",
'photo' =>"Papier

photographique"), 'stylos' => array(

'Balle' =>"Ball
Point", 'hilite' => "Surligneurs",
'marker' => "Marqueurs"),

'divers'=> tableau(

'ruban'
=>"Ruban adhésif",
'colle' =>"Adhésifs", "clips"
=>"Trombones"
)
);
echo "<pré>" ;

foreach($produitsas $section =>


$items) foreach($items as $key => $value)
echo "$section :\t$clé\t($valeur)<br>" ;

echo "</pre>" ;
?>

Pour rendre les choses plus claires maintenant que le code commence à se
développer, j'ai renommé certains éléments. Par exemple, comme le tableau
précédent $paper n'est plus qu'une sous-section d'un tableau plus grand, le tableau
principal s'appelle désormais $products. Dans ce tableau, il y a trois éléments
(papier, stylos et divers) dont chacun contient un autre tableau avec des paires
clé/valeur.
Si nécessaire, ces sous-réseaux auraient pu contenir encore plus de réseaux.
Par exemple, sous la bille, il peut y avoir de nombreux types et couleurs de
stylos à bille disponibles dans la boutique en ligne. Mais pour l'instant, j'ai
limité le code à une profondeur de seulement deux.
Une fois que les données du tableau ont été affectées, j'utilise une paire de
foreach imbriqués ... comme boucles pour imprimer les différentes valeurs. La
boucle externe extrait les sections principales du niveau supérieur du tableau,
et la boucle interne extrait les paires clé/valeur pour les catégories de chaque
section.
Tant que vous vous souvenez que chaque niveau du tableau fonctionne de la même
manière (c'est une paire clé/valeur), vous pouvez facilement écrire du code pour
accéder à n'importe quel élément à n'importe quel niveau.
L'instruction echo utilise le caractère d'échappement PHP \t, qui génère une
tabulation. Bien que les onglets ne soient normalement pas significatifs pour le
navigateur Web, je les laisse être utilisés pour la mise en page en utilisant les
balises <pre> ... </pre> , qui indiquent au navigateur Web de formater le texte
comme préformaté et à espacement fixe, et non de ignorer les caractères
d'espacement tels que les tabulations et les sauts de ligne. La sortie de ce code
ressemble à ceci :

papier: photoc (Photocopieuse


opieuse & polyvalent)
papier: jet (jet
d'e d'encreImprimante)
ncr
e
papier: las (LaserImprimante)
er
papier: photo (Photographiqu
ePapier)
des Balle (BalleIndiquer)
stylos:
des hilite (Surligneurs)
stylos:
des marqueur (Marqueurs)
stylos:
divers : ruban (CollantR
uban)
divers : la colle (Adhésifs
)
divers : clips (Trombo
nes)

Vous pouvez accéder directement à un élément particulier du tableau à l'aide de


crochets, comme ceci :

echo$produits['misc']['colle'] ;

wqui les sortiestil évaluerAdhésifs.


Vous pouvez également créer des tableaux multidimensionnels numériques
accessibles directement par des index plutôt que par des identifiants
alphanumériques.Exemple 6-11crée le plateau d'une partie d'échecs avec les
pièces dans leurs positions de départ.
Exemple 6-1 . Créer un tableau numérique multidimensionnel
<?php
$échiquier = tableau(
tableau('r','n', 'b', 'q', 'k', 'b', 'n', 'r'),
tableau('p','ppppppp'),
déployer('', ' ', ' ', ' ', ' ', ' ', ' ', ' '),
déployer('', ' ', ' ', ' ', ' ', ' ', ' ', ' '),
déployer('', ' ', ' ', ' ', ' ', ' ', ' ', ' '),
déployer('', ' ', ' ', ' ', ' ', ' ', ' ', ' '),
tableau('P','PPPPPPP'),
tableau('R','N', 'B', 'Q', 'K', 'B', 'N', 'R')
);

echo "<pré>" ;

foreach($échiquiercomme

$ligne)
{
pour chaque($ligne
comme $morceau) echo
"$morceau";

echo "<br>" ;
}

echo "</pre>" ;
?>

Dans cet exemple, leles lettres minuscules représentent les pièces noires et les
majusculesblanche. La clé est r = tour, n = cavalier, b = fou, k = roi, q = reine et p
= pion. Encore une fois, une paire de foreach imbriqués ... alors que les boucles
parcourent le tableau
et affiche son contenu. La boucle externe traite chaque ligne dans la
$row, qui est lui-même un tableau, car le tableau $chessboard utilise un
variable
sous-tableau pour chaque ligne. Cette boucle contient deux instructions,
donc des accolades les entourent.
La boucle interne traite ensuite chaque carré d'affilée, en sortant le caractère
($piece) qui y est stocké, suivi d'un espace (pour aligner l'impression). Cette
boucle a une seule instruction, les accolades ne sont donc pas nécessaires pour
l'encadrer. Le <pré>et les balises </pre> garantissent que la sortie s'affiche
correctement, comme ceci :

rnbqkbnrppppp
ppp

PPPPPPPPRNBQK
BNR

Vous pouvez également accéder directement à n'importe quel élément de ce


tableau à l'aide de crochets, comme ceci :

echo $échiquier[7][3] ;

Cette instruction affiche la lettre majuscule Q, le huitième élément vers le bas et le


quatrième vers le bas (en se rappelant que les index de tableau commencent à 0 et
non à 1).

Utilisation des fonctions de tableau


Vous avez déjà vu la liste et chacune des fonctions, mais PHP est livré avecde
nombreuses autres fonctions de gestion des tableaux. La liste complète est
surhttp://tinyurl.com/arraysinphp. Cependant, certaines de ces fonctions sont si
fondamentales qu'il vaut la peine de prendre le temps de les examiner ici.

est_tableau
Les tableaux et les variables partagent le même espace de noms. Cela signifie
que vous ne pouvez pasont une variable de chaîne appelée $fred et un tableau
également appelé $fred. Si vous avez des doutes et que votre code doit vérifier si
et affiche son contenu. La boucle externe traite chaque ligne dans la
une variable est un tableau, vous pouvez utiliser
variable
la fonction is_array comme
ceci :
echo (is_array($fred)) ? "Est un tableau" : "N'est pas un tableau" ;

NotetchapeaujeF$ gratuitré a ne pas encore étéassigné une


évaluer,unenIndéfinirévariable
le message seraêtre généré.

compter
Bien que chaque fonction et foreach ... comme structure de boucle soient
d'excellents moyens de parcourir le contenu d'un tableau, vous devez parfois
savoir exactement combien d'éléments il y a dans votre tableau, en particulier
si vous allez êtreles référençant directement. Pour compter tous les éléments du
niveau supérieur d'un tableau, utilisez une commande telle que la suivante :

compteur d'echo($fred);

Si vous souhaitez savoir combien d'éléments il y a en tout dans un tableau


multidimensionnel, vous pouvez utiliser une instruction telle que :

echo count($fred, 1);

Le deuxième paramètre est facultatif et définit le mode à utiliser. Ce devrait


être soit un 0pour limiter le comptage au seul niveau supérieur, ou 1 pour forcer
également le comptage récursif de tous les éléments du sous-tableau.

sorte
Le tri est si courant que PHP fournit une fonction intégrée. Dans sa forme la plus
simple, vous l'utiliseriez comme ceci :

tri($fred);

Contrairement à certaines autres fonctions, sort agira directement sur le tableau


fourni plutôt que de renvoyer un nouveau tableau d'éléments triés. Au lieu de cela,
il renvoie TRUE en cas de succès et FALSE en cas d'erreur et prend également en
charge quelques drapeaux, mais les deux principaux que vous pourriez souhaiter
utiliser forcent le tri à être effectué numériquement ou sous forme de chaînes,
comme
ce:

tri($fred,SORT_NUMERIC );
tri($fred, SORT_STRING);

Vous pouvez également trier un tableau dans l'ordre inverse à l'aide de lafonction
rsort, comme ceci :

rsort($fred,SORT_NUMERIC )
; rsort($fred, SORT_STRING);

mélanger
Il peut arriver que vous ayez besoin que les éléments d'un tableau soient placés
dans un ordre aléatoire, comme lorsque vous créez un jeu de cartes :

mélanger($cartes);

Comme sort, shuffle agit directement sur le tableau fourni etrenvoie VRAI en
cas de succès ou FAUX en cas d'erreur.

exploser
C'est une fonction très utile avec laquelle vous pouvez prendre une chaîne
contenant plusieurs éléments séparés par un seul caractère (ou une chaîne de
caractères) puis placer chacun de ces éléments dans un tableau. Un exemple
pratique consiste à diviser une phrase en un tableau contenant tous ses mots,
comme dansExemple 6-12.
Exemple 6-12. Explosionune chaîne dans un tableau en utilisant des espaces
<?php
$ temp= exploser(' ', "Ceci est une phrase de sept mots"); print_r($temp);
?>

Cet exemple imprime ce qui suit (sur une seule ligne lorsqu'il est affiché dans
un navigateur) :

Déplo
yer (
[0]=> Ceci
[1]=> est
[2] => un
[3] => phrase
[4]=> avec
[5]=> sept
[6] => mots
)

Le premier paramètre, le délimiteur, nécessitepas être un espace ou même un seul


caractère.Exemple 6-13montre une légère variation.
Exemple 6-13. Faire exploser unchaîne délimitée par *** dans un tableau
<?php
$ temp= éclater('***', "Une ***phrase***avec***astérisques");
print_r($temp);
?>

Le code dansExemple 6-13imprime ce qui suit :

Déplo
yer (
[0] => UNE
[1] => phrase
[2] => avec
[3] => astérisque
s
)

extrait
Parfois, il peut être pratique de transformer les paires clé/valeur d'un tableau
envariables PHP. Un de ces moments peut être lorsque vous traitez le $_GET
ou
Variables $_POST telles qu'elles sont envoyées à un script PHP par un
formulaire.
Lorsqu'un formulaire est soumissur le Web, le serveur Web décompresse les
variablesdans un tableau global pour le script PHP. Si les variables ont été
envoyées à l'aide de la méthode GET, elles seront placées dans un tableau
associatif appelé $_GET ; s'ils ont été envoyés en POST, ils seront placés dans
un tableau associatif appelé $_POST.
Vous pouvez, bien sûr, parcourir ces tableaux associatifs de la manière indiquée
dans les exemples jusqu'à présent. Cependant, parfois, vous souhaitez simplement
stocker les valeurs envoyées dans des variables pour une utilisation ultérieure.
Dans ce cas, vous pouvez demander à PHP de faire le travail automatiquement
pour vous :
extrait($_GET);

Ainsi, par exemple, si le paramètre de chaîne de requête q est envoyé à un script


PHP avec la valeur associée Salut, une nouvelle variable appelée $q sera créée et
affectée à cette valeur.
Soyez prudent avec cette approche, cependant, car le cas échéantles variables
extraites entrent en conflit avec celles que vous avez déjà définies, vos valeurs
existantes serontécrasé. Pour éviter cette possibilité, vous pouvez utiliser l'un des
nombreux paramètres supplémentaires disponibles pour cette fonction, comme
ceci :

extrait($_GET,EXTR_PREFIX_ALL, 'fromget');

Dans ce cas, toutes les nouvelles variables commenceront par la chaîne de préfixe
donnée suivie d'un trait de soulignement, donc $q deviendra $fromget_q. Je vous
recommande fortement d'utiliser cette version de la fonction lors de la
manipulation des tableaux $_GET et $_POST, ou de tout autre tableau dont les
clés pourraient être contrôlées par l'utilisateur, car des utilisateurs malveillants
pourraient soumettre des clés choisies délibérément pour écraser les noms de
variables couramment utilisés et compromettre votre site web.

compact
Jiciarealsotempsswpoule toiWashingtonNTto utilisercompact,tiljeinverse
deextrait,to créer un tableau à partir des variables et de leurs valeurs.Exemple 6-
14montre comment vous pouvez utiliser cette fonction.
Exemple 6-14. Utilisation de la fonction compacte
<?php
$fname ="Médecin";
$sname ="OMS";
$planète =« Gallifrey » ;
$ système =« embouteillage » ;
$constellation = "Kasterborous" ;

$contact= compact('fname', 'sname', 'planet', 'system', 'constellation'); print_r($contact);


?>

Le résultat de la courseExemple 6-14est:


Déplo
yer (
[nom]=> Docteur
[sname] => Who
[planet] => Gallifrey
[system] => Gridlock
[constellation]=> Kasterborous
)

Note commentcompacttrécahierstil variable des nomsto êtresfournijen devis, pas


précédé par une $ssymbole.Jle sienjes carcompacttjesjeregarderFou unelist de
variabledes noms.
Une autre utilisation de cette fonction est pour le débogage, lorsque vous
souhaitez visualiser rapidement plusieurs variables et leurs valeurs, comme
dansExemple 6-15.
Exemple 6-15. Utiliser compact pour aider avecdébogage
<?php
$j = 23;
$ temp ="Bonjour";
$adresse= "1 Vieille Rue" ;
$âge = 61 ;

print_r(compact(exploser('', 'j âge de l'adresse temporaire')));


?>

Cela fonctionne en utilisant la fonction d'explosion pour extraire tous les mots de
la chaîne dans un tableau, qui est ensuite passé à la fonction compacte, qui à son
tour renvoie un tableau à print_r, qui affiche enfin son contenu.
Si vous copiez et collez la ligne de code print_r, il vous suffit de modifier les
variables qui y sont nommées pour une impression rapide d'un groupe de
valeurs de variables. Dans cet exemple, la sortie est :

Déplo
yer (
[j] => 23
[température]=> Bonjour
[adresse]=> 1 Vieille
Rue [âge] => 61
)
réinitialiser
Lorsque la construction foreach ... as ou la fonction each parcourt unarray, il
conserve un pointeur PHP interne qui note quel élément du tableau il doit renvoyer
ensuite. Si votre code doit revenir au début d'un tableau, vous pouvez émettre
reset, qui renvoie également la valeur de cet élément.
Voici des exemples d'utilisation de cette fonction :

réinitialiser($fred); // Jeter la valeur de retour


$élément= réinitialiser($fred); // Conserve le premier élément du tableau dans $item

finir
Comme pour la réinitialisation, vous pouvez déplacer le pointeur de tableau
interne de PHP vers l'élément final dansun tableau utilisant la fonction end, qui
renvoie également la valeur de l'élément, et peut être utilisé comme dans ces
exemples :

fin($fred);
$élément= fin($fred);

Ce chapitre conclut votre introduction de base à PHP, et vous devriez maintenant


être capable d'écrire des programmes assez complexes en utilisant les compétences
que vous avez acquises. Dans le chapitre suivant, nous verrons comment utiliser
PHP pour des tâches courantes et pratiques.

Des questions
1. Quelle est la différenceentre un tableau numérique et un tableau associatif ?

2. Quel est le principal avantage de lamot-clé tableau ?

3. Quelle est la différence entre foreach et each ?

4. Comment pouvez-vous créer untableau multidimensionnel ?

5. Comment déterminer le nombre d'éléments dans un tableau ?

6. Quel est le but de la fonction d'éclatement ?


7. Comment pouvez-vous définir le pointeur interne de PHP dans un
tableau sur le premier élément du tableau ?

VoirChapitre 6 RéponsesdansAnnexe Apour les réponses à ces questions.


Chapitre 7. PHP pratique

Les chapitres précédents sont passés en revue les éléments du langage PHP. Ce
chapitre s'appuie sur vos nouvelles compétences en programmation pour vous
enseigner certaines tâches pratiques courantes mais importantes. Vous apprendrez
les meilleures façons de gérer la gestion des chaînes pour obtenir un code clair et
concis qui s'affiche dans les navigateurs Web exactement comme vous le
souhaitez, y compris la gestion avancée de la date et de l'heure. Vous découvrirez
également comment créer et modifier des fichiers, y compris ceux téléchargés par
les utilisateurs.

Utilisation de printf
Vous avez déjà vu les fonctions d'impression et d'echo, qui envoient simplement
du texte au navigateur. Mais une fonction beaucoup plus puissante, printf, contrôle
le format de la sortie en vous permettant de mettre des caractères de formatage
spéciaux dans une chaîne. Pour chaque caractère de formatage, printf s'attend à ce
que vous passiez un argument qu'il affichera en utilisant ce format. Par exemple,
l'exemple suivant utilise le spécificateur de conversion %d pour afficher la valeur
3 en décimal :

printf("Lày a %d articles dans votre panier", 3);

Si vous remplacez %d par %b, la valeur 3 sera affichée en binaire (11).Tableau 7-


1affiche les spécificateurs de conversion pris en charge.

Tableau 7-1. Les spécificateurs de conversion printf

Prescript Action de conversion sur l'argument Exemple (pour un arg de


eur arg 123)

% Affiche un caractère % (aucun argument %


n'est requis).

b Affiche arg sous la forme d'un entier 1111011


binaire.

c Afficher le caractère ASCII pour {


l'argument.

ré Affiche arg sous la forme d'un entier 123


décimal signé.
e Afficher arg en notation scientifique. 1.23000e+2

F Affiche arg sous forme de virgule 123.000000


flottante.

o Affiche arg sous la forme d'un entier 173


octal.

s Affiche arg sous forme de chaîne. 123

tu Affiche arg sous la forme d'un nombre 123


décimal non signé.

X Afficher arg en hexadécimal minuscule. 7b

X Afficher arg en hexadécimal majuscule. 7B

Vous pouvez avoir autantspécificateurs comme vous le souhaitez dans une


fonction printf, tant que vous passez un nombre correspondant d'arguments, et
tant que chaque spécificateur est précédé de une
%ssymbole.Jdonc,tilFsuivantcodejes valide,unendvaje sortir"Mynom est Simon.
J'ai 33 ans, soit 21 en hexadécimal":

printf("Monle nom est %s. J'ai %d ans, soit %X en hexadécimal", 'Simon', 33, 33);

Si vous omettez des arguments, vous recevrez une erreur d'analyse vous
informant qu'un crochet droit, ), a été rencontré de manière inattendue.
Un exemple plus pratique de printf définit les couleurs en HTML en utilisant
décimal. Par exemple, supposons que vous vouliez une couleur qui a une valeur de
triplet de 65 rouges, 127 verts et 245 bleus, mais que vous ne vouliez pas les
convertir vous-même en hexadécimal. Une solution facile est :

printf("<spanstyle='color:#%X%X%X'>Bonjour</span>", 65, 127, 245);

CZuttilFformat detilccouleursspécification compris entretiluneposttrophes('')


soigneusement. Vient d'abord le signe dièse, ou dièse, (#) attendu par la
couleurspécification. Viennent ensuite trois spécificateurs de format %X, un pour
chacun de vos nombres. La sortie résultante de cette commande est :

<étenduestyle='color:#417FF5'>Bonjour</span>
Habituellement, vous trouverez pratique d'utiliser des variablesou des expressions
comme arguments de
printf. Par exemple, si vous avez stocké des valeurs pour vos couleurs dans
les trois variables
$r, $g et $b, vous pouvez créer une couleur plus foncée avec :

printf("<spanstyle='color:#%X%X%X'>Bonjour</span>", $r-20, $g-20, $b-20);

Réglage de précision
Non seulement vous pouvez spécifier un type de conversion, mais vous pouvez
également définir la précision du résultat affiché. Par exemple, les montants
des devises sont généralement affichés avec seulement deux chiffres de
précision. Cependant, après un calcul, une valeur peut avoir une précision
supérieure à celle-ci, comme 123,42 / 12, ce qui donne 10,285. Pour vous
assurer que ces valeurs sont correctement stockées en interne, mais affichées
avec seulement deux chiffres de précision, vous pouvez insérer la chaîne ".2"
entre le symbole % et le spécificateur de conversion :

printf("Lele résultat est : $%.2f", 123,42 / 12);

La sortie de cette commande est :

lele résultat est de 10,29 $

Mais vous avez en fait encore plus de contrôle que cela, car vous pouvez
également spécifier si vous souhaitez remplir la sortie avec des zéros ou des
espaces en faisant précéder le spécificateur de certaines valeurs.Exemple 7-
1montre quatre combinaisons possibles.
Exemple 7-1. Réglage de précision
<?php
echo"<pré>" ; // Active la visualisation des espaces

// Remplir à 15 espaces
printf("Lele résultat est $%15f\n", 123,42 12);

/Complétez jusqu'à 15 espaces, remplissez avec


des zéros printf("Le résultat est $%015f\n", 123.42
12);

/Remplir à 15 espaces, précision à 2 décimales


printf("Le résultat est $%15.2f\n", 123.42 12);
/Remplir à 15 espaces, précision à 2 décimales, remplir avec des zéros
printf("Lele résultat est $%015.2f\n", 123.42 12);

/Remplissez à 15 espaces, précision de 2 décimales, remplissez avec le


symbole # printf("Le résultat est $%'#15.2f\n", 123.42 / 12);
?>

La sortie de cet exemple ressemble à ceci :

lele résultat est $ 10.285000


lele résultat est 00000010.285000
Le résultat est $ 10.29
lele résultat est
$000000000010.29 Le résultat
est $##########10.29

Le fonctionnement est simple si vous allez de droite à gauche (voirTableau 7-


2). Remarquerez que:
Le caractère le plus à droite est le spécificateur de conversion. Dans ce cas,
c'est f pour virgule flottante.

Juste avant le spécificateur de conversion, s'il existe un point et un nombre


ensemble, la précision de la sortie est spécifiée comme la valeur du nombre.

Qu'il y ait ou non une précisionspécificateur, s'il y a un nombre, cela


représente le nombre de caractères auquel la sortie doit être remplie. Dans
l'exemple précédent, il s'agit de 15 caractères. Si la sortie est déjà égale ou
supérieure à la longueur de remplissage, cet argument est ignoré.

Le paramètre le plus à gauche autorisé après le symbole % est un 0, qui est


ignoré sauf si une valeur de remplissage a été définie, auquel cas la sortie est
remplie de zéros au lieu d'espaces. Si un caractère de remplissage autre que
zéro ou un espace est requis, vous pouvez utiliser celui de votre choix tant que
vous le faites précéder d'un guillemet simple, comme ceci : '#.

Sur la gauche se trouve le symbole %, qui démarre la conversion.

Tableau 7-2. Composants du spécificateur de conversion

Nombre de
Démarrerco Tamponp tamponpers Afficherpr Spécificateur
nversion ersonnag onnages écision de Exemples
e conversion

% 15 F 10.285000

% 0 15 .2 F 000000000010.29

% '# 15 .4 F ########10.2850

Rembourrage de chaîne
Vous pouvez également remplir les chaînes aux longueurs requises (comme vous
le pouvez avec les nombres), sélectionner différents caractères de remplissage et
même choisir entre la justification à gauche et à droite.Exemple 7-2montre divers
exemples.
Exemple 7-2. Rembourrage de chaîne
<?php
echo"<pré>" ; // Active la visualisation des espaces

$h= 'Rasmus';

printf("[%s]\n", $h);// Sortie de chaîne standard printf("[%12s]\n",


$h);// Justifier à droite avec des espaces jusqu'à
largeur 12 printf("[%-12s]\n", $h);// Justifier à gauche avec des espaces
printf("[%012s]\n", $h);// Zéro rembourrage
printf("[%'#12s]\n\n", $h);// Utiliser le caractère de remplissage personnalisé '#'

$d= 'Rasmus Lerdorf'; //Le créateur original de PHP

printf("[%12.8s]\n",$d); // Justifier à droite, coupure de 8 caractères printf("[%-


12.12s]\n", $d); // Justifier à gauche, coupure de 12 caractères printf("[%-
'@12.10s]\n",$d); // Justifier à gauche, remplir '@', couper 10 caractères
?>

Notez comment, à des fins de mise en page dans une page Web, j'ai utilisé la
balise HTML <pre> pour conserver tous les espaces et le caractère de saut de
ligne \n après chacune des lignes à afficher. Le résultat de cet exemple est le
suivant :

[Rasmus]
[
Rasmus][
Rasme
][000
000Rasm
us]
[######R
asmus]

[ Rasmus L]
[RasmeLer
do] [Rasmus
Ler@ @]

Lorsque vous spécifiez une valeur de remplissage, si une chaîne est déjà d'une
longueur égale ou supérieure à cette valeur, elle sera ignorée, sauf si une
valeur de coupure est donnée qui raccourcit la chaîne à une valeur inférieure à
la valeur de remplissage.
Tableau 7-3montre une répartition des composants disponibles pour les spécificateurs de
conversion de chaîne.

Tableau 7-3. Composants du spécificateur de conversion de chaîne

Nombre de Exemples
Démarrerco Justifier à Rembour caractères Spécificateu (en
nversion gauche/à rageperso de Coupe r de utilisant"Ras
droite nnage remplissage r conversion mus")

% s [Rasmus]

% - dix s [Rasme ]

% '# 8 .4 s [####Ras
me]

Utilisation de sprintf
Souvent, vous ne souhaitez pas afficher le résultat d'une conversion, mais vous
en avez besoin pour l'utiliser ailleurs dans votre code. C'est là qu'intervient la
fonction sprintf. Avec elle, vous pouvez envoyer la sortie à une autre variable
plutôt qu'au navigateur.
Vous pouvez l'utiliser simplement pour effectuer une conversion, comme dans
l'exemple suivant, qui renvoie la valeur de la chaîne hexadécimale pour le groupe
de couleurs RVB 65, 127, 245 dans $hexstring :

$hexstring= sprintf("%X%X%X", 65, 127, 245);

Ou vous souhaiterez peut-être stocker la sortie prête à être affichée plus tard :

$out= sprintf("Le résultat est : $%.2f", 123.42 / 12); echo $out;

Fonctions de date et d'heure


Pour garder une trace de la date et de l'heure, PHP utilise des horodatages Unix
standard, qui sont simplement le nombre de secondes depuis le début du 1er
janvier 1970. Pour déterminer l'horodatage actuel, vous pouvez utiliser la fonction
time : echo time();
Étant donné que la valeur est stockée en secondes, pour obtenir l'horodatage
pour cette heure la semaine prochaine, vous utiliseriez ce qui suit, qui ajoute
7 jours multiplié par 24 heures multiplié par 60 minutes multiplié par
60 secondes à la valeur renvoyée :

echotemps() + 7 24 60* 60 ;

jeF toiwishtocréere unehorodatagepFou une étant donné Date, toiCalifornien


utilisertilmktimeune fonction. Sa sortie est l'horodatage 946684800 pour la
première seconde de la première minute de la première heure du premier jour de
l'an 2000 :

echomktime(0, 0, 0, 1, 1, 2000);

Les paramètres à passer sont, dans l'ordre de gauche à


droite : Le numéro de l'heure (0–23)

Le numéro de la minute (0–59)

Le nombre de secondes (0–59)

Le numéro du mois (1–12)

Le numéro du jour (1–31)

L'année (1970-2038, ou 1901-2038 avec PHP 5.1.0+ sur les systèmes signés 32
bits)

REMARQUE
Vous vous demandez peut-être pourquoi vous êtes limité aux années 1970 à 2038. Eh bien, c'est
parce que les développeurs originaux d'Unix ont choisi le début de l'année 1970 comme date de
base qu'aucun programmeur ne devrait avoir à parcourir avant ! Heureusement, parce que (à
partir de la version 5.1.0) PHP prend en charge les systèmes utilisant un entier 32 bits signé
pour l'horodatage, les dates de 1901 à 2038 sont autorisées sur eux. Cependant, cela introduit
un problème encore pire que l'original parce que les concepteurs d'Unix ont également décidé
que personne n'utiliserait Unix après environ 70 ans environ, et ont donc cru pouvoir s'en tirer
en stockant l'horodatage sous forme de valeur 32 bits, ce qui épuisé le 19 janvier 2038! Cela
créera ce qui est devenu connu sous le nom de Y2K38
bug (un peu comme le millénairebogue, causé par le stockage des années sous forme de
valeurs à deux chiffres, etwquialso euto êtreFixe).pHPjeintroduittil DateHeureclassesjen
version 5.2to résoudre ce problème, mais cela ne fonctionnera que sur une architecture 64
bits.

Pour afficher la date, utilisez la fonction de date, qui prend en charge une pléthore
d'options de formatage, vous permettant d'afficher la date comme vous le
souhaitez. Le format est le suivant :

date($format,$horodatage);

Jil paramètre$formatsdevrait être


unetringccontenantFformatagespécificateursuneest détailléjen Table 7-
4,unend$horodatagepsdevrait être uneturienhorodatagep.Foutilliste complète des
spécificateurs, voirhttp://php.net/manual/en/function.date.php. La commande
suivante affichera la date et l'heure actuelles au format "Jeudi 6 juillet 2017 -
13h38":

echodate("l F jS, Y - g:ia", heure());

Tableau 7-4. Les principaux spécificateurs de format de fonction de date

Description du format Valeur renvoyée

Spécificateurs de jour

ré Jour du mois, deux chiffres, avec des zéros non significatifs 01 au


31
ré Jour de la semaine, trois lettres Du lundi au dimanche

j Jour du mois, pas de zéros non significatifs 1 à 31

je Jour de la semaine, noms complets du dimanche au samedi

N Jour de la semaine, numérique, du lundi au dimanche 1à7

S Suffixe pour le jour du mois (utile avec le spécificateur j) st, nd, rd ou th

w Jour de la semaine, numérique, du dimanche au samedi 0 à 6

z Jour de l'année 0 à 365

Spécificateur de semaine
O Numéro de semaine de l'année 01 à 52

Month spécificateurs

F Nom du mois janvierto décembre

m Numéro du mois aveczéros de tête 01 à 12

M Nom du mois,trois lettres janvier àdéc

n Numéro du mois, sans débutdes zéros 1 à 12

t Nombre de jours dans un mois donné 28 à 31

Spécificateurs d'année

L Année bissextile 1 = Oui, 0 = Non

y Année, 2 chiffres 00 à 99

Oui Année, 4 chiffres 0000 à 9999

Spécificateurs de temps

une Avant ou après midi, minuscule AM ou PM

UNE Avant ou après midi, majuscule AM ou PM

g Heure du jour, 12 heuresformat, pas de zéros 1 à 12


non significatifs

g Heure du jour, 24 heuresformat, pas de zéros 00 à 23


non significatifs

h Heure du jour, format 12 heures,avec des zéros 01 à 12


non significatifs

H Heure du jour, format 24 heures,avec des zéros 00 à 23


non significatifs

je Procès-verbal, avec en-têtedes zéros 00 à 59

s Secondes, avec avancedes zéros 00 à 59

Constantes de date
Il existe un certain nombre de constantes utiles que vous pouvez utiliser avec la
commande date pour renvoyer la date dans des formats spécifiques. Par exemple,
date(DATE_RSS) renvoie la date et l'heure actuelles dans le format valide pour un
flux RSS. Certaines des constantes les plus couramment utilisées sont :
DATE_ATOM
Jle sienjestilFformatFouÀomfraisds.JilpHPFformatjes"Ymd\TH:i:sP"uneLe dernier
exemple de sortie est "2018-08-16T12:00:00+00:00".

DATE_COOKIE
Il s'agit du format des cookies définis à partir d'un serveur Web ou de
JavaScript. Le format PHPjes"je,dMy H:i:s T" et l'exemple de sortie est
"Thursday, 16- Aug-18 12:00:00 UTC".

DATE_RSS
Jle sienjestilFformatFouRSSfraisds.JilpHPFformatjes"RÉ,d MYH:i:s O"
et l'exemple de sortie est "Jeu, 16 août 2018 12:00:00 UTC".

DATE_W3C
C'est le format du World Wide Web Consortium. Le format PHP est
"Ymd\TH:i:sP"unendeexemple sortirjes"2018-08-16T12:00:00+00:00".

La liste complète se trouve surhttp://php.net/manual/en/class.datetime.php.

Utilisation de la date de contrôle


Vous avez vu comment afficher une date valide dans une variété de formats. Mais
comment pouvez-vous vérifier si un utilisateur a soumis une date valide à votre
programme ? La réponse est de passer le mois, le jour et l'année à la fonction
checkdate, qui renvoie la valeur TRUE si la date est valide, ou FALSE si elle ne
l'est pas.
Par exemple, si le 30 février de n'importe quelle année est entré, ce sera
toujours une date invalide.Exemple 7-3montre le code que vous pourriez
utiliser pour cela. Dans l'état actuel des choses, il trouvera la date donnée
invalide.
Exemple 7-3. Vérification de la validité d'une date
<?php
$mois= 9 ; //Septembre (ne compte que 30 jours)
$jour = 31; // 31e
$année = 2018 ; // 2018
si(checkdate($mois, $jour, $année)) echo "La date est valide" ;
sinon echo "La date n'est pas valide" ;
?>

La gestion des fichiers


Aussi puissant soit-il, MySQL n'est pas le seul (ni forcément le meilleur) moyen
de stocker toutes les données sur un serveur web. Parfois, il peut être plus rapide et
plus pratique d'accéder directement aux fichiers sur le disque dur. Les cas dans
lesquels vous pourriez avoir besoin de le faire sont la modification d'images telles
que des avatars d'utilisateurs téléchargés ou des fichiers journaux que vous
souhaitez traiter.
Tout d'abord, cependant, une note sur le nommage des fichiers : si vous écrivez
du code qui peut être utilisésur diverses installations PHP, il n'y a aucun moyen
de savoir si ces systèmes sont sensibles à la casse. Par exemple, les noms de
fichiers Windows et Mac OS X ne sont pas sensibles à la casse, mais ceux de
Linux et Unix le sont. Par conséquent, vous devez toujours supposer que le
système est sensible à la casse et respecter une convention telle que tous les noms
de fichiers en minuscules.

Vérifier si un fichier existe


Pour déterminer si un fichier existe déjà, vous pouvez utiliser le
file_existsfonction, qui renvoie TRUE ou FALSE, et est utilisée comme ceci : if
(file_exists("testfile.txt")) echo "Le fichier existe" ;

Création d'un fichier


À ce stade, testfile.txt n'existe pas, alors créons-le et écrivons-y quelques
lignes. TaperExemple 7-4et enregistrez-le sous testfile.php.
Exemple 7-4. Créer un texte simplefichier
<?php // testfile.php
$fh= fopen("testfile.txt", 'w') or die("Échec de la création du fichier");

$texte =
<<<_END Ligne 1
Ligne 2
Ligne 3
_FINIR;
fécrire($fh,$text) or die("Impossible d'écrire dans le
fichier"); fferme($fh);
echo"Fichier 'testfile.txt' écrit avec succès" ;
?>

Lorsque vous exécutez ceci dans un navigateur, tout va bien, vous recevrez le
message Fichier'testfile.txt' écrit avec succès. Si vous recevez un message
d'erreur, votre disque dur est peut-être plein ou, plus probablement, vous
n'êtes peut-être pas autorisé à créer ou à écrire dans le fichier, auquel cas
vous devez modifier les attributs du dossier de destination en fonction de
votre système d'exploitation.
Sinon, le fichier testfile.txt devrait maintenant résider dans le même dossier
dans lequel vous avez enregistré le programme testfile.php. Essayez d'ouvrir le
fichier dans un éditeur de texte ou de programme. Le contenu ressemblera à
ceci :

Ligne1
Ligne2
Ligne3

Ce simple exemplemontre la séquence que prend toute la gestion des fichiers :


1. Commencez toujours par ouvrir le fichier. Vous faites cela via un appel à fopen.

2. Jpoule toiCaliforniencalje autreFonctions;


iciweordonnanceetotilfile(fécrire), mais vous pouvez également lire à
partir d'un fichier existant (fread ou fgets) et faire d'autres choses.

3. Terminez en fermant le fichier (fclose). Bien que le programme le fasse


pour vous lorsqu'il se termine, vous devez nettoyer après vous en fermant
le fichier lorsque vous avez terminé.

Chaque fichier ouvert nécessite une ressource de fichier afin que PHP puisse y
accéder et le gérer. L'exemple précédent définit la variable $fh (que j'ai choisi
pour désigner le descripteur de fichier) sur la valeur renvoyée par la fonction
fopen. Par la suite, chaque fonction de gestion de fichier qui accède au fichier
ouvert, telle que fwrite ou fclose, doit être transmise $fh comme paramètre pour
identifier le fichier auquel on accède. Ne vous souciez pas du contenu de la
variable $fh ; c'est un nombre que PHP utilise pour faire référence à des
informations internes sur le fichier - vous transmettez simplement la variable à
d'autres fonctions.
En cas d'échec, FALSE sera renvoyé par fopen. L'exemple précédent montre un
moyen simple de capturer et de répondre à l'échec : il appelle la fonction die pour
terminer le programme et donner à l'utilisateur un message d'erreur. Une
application Web n'abandonnerait jamais de cette manière grossière (vous créeriez
plutôt une page Web avec un message d'erreur), mais cela convient à nos fins de
test.
Notez le deuxième paramètre de l'appel fopen. C'est simplement le caractère w, qui
indique à la fonction d'ouvrir le fichier en écriture. La fonction crée le fichier s'il
n'existe pas déjà. Soyez prudent lorsque vous jouez avec ces fonctions : si le fichier
existe déjà, le paramètre w mode fait que l'appel fopen supprime l'ancien contenu
(même si vous n'écrivez rien de nouveau !).
Il existe plusieurs différentsparamètres de mode qui peuvent être utilisés ici,
comme détaillé dansTableau 7-5.

Tableau 7-5. Les modes fopen pris en charge

Mode action La description

'r' Lire depuis le début Ouvert en lecture uniquement ; placer le pointeur de fichier au
du fichier. début de
le fichier. Renvoie FALSE si le fichier n'existe pas déjà.

'r Lire dedémarrer le Ouvert pour la lecture et l'écriture; placez le pointeur de fichier
+' fichier et autoriser surdébut du dossier. Renvoie FALSE si le fichier n'existe pas
l'écriture. déjà.

'w Écrire depuis le Ouvert pour l'écriture seulement; placez le pointeur de fichier
' début du fichieret au début du fichier et tronquez le fichier à une longueur nulle.
tronquer le fichier. Si le fichier n'existe pas, essayez de le créer.

'w Écrire depuis le Ouvert pour la lecture et l'écriture; placez le pointeur de fichier
+' début du au début du fichier et tronquez le fichier à une longueur nulle.
fichier,tronquer le Si le fichier n'existe pas, essayez de le créer.
fichier et autoriser
la lecture.

'u Ajouter à la fin du Ouvert pour l'écriture seulement ; placer le pointeur de fichier à
n fichier. la fin du fichier. Si le fichier n'existe pas, essayez de le créer.
e'

'u Ajouter à la fin du Ouvert pour la lecture et l'écriture; placer le pointeur de fichier à
n fichier et autoriser la fin du fichier. Si le fichier n'existe pas, essayez de le créer.
+' la lecture.

Lecture à partir de fichiers


Le moyen le plus simple de lire à partir d'un fichier texte est de saisir une ligne
En cas d'échec, FALSE sera renvoyé par fopen. L'exemple précédent montre un
entière via fgets
(pensez au s final comme représentant une chaîne), comme
dansExemple 7-5.
Exemple 7-5.Lire un fichier avec fgets
<?php
$fh= fopen("testfile.txt", 'r') ou
mourir("Fichiern'existe pas ou vous n'êtes pas autorisé à l'ouvrir");

$ligne =
fgets($fh);
fferme($fh);
echo $ligne;
?>

Si vous avez créé le fichier comme indiqué dansExemple 7-4, vous obtiendrez la
première ligne :

Ligne1

Ou vous pouvez récupérer plusieurs lignes ou portions de lignes à travers le fread


fonction, comme dansExemple 7-6.
Exemple 7-6. Lire un fichieravec de la peur
<?php
$fh= fopen("testfile.txt", 'r') ou
mourir("Fichiern'existe pas ou vous n'êtes pas autorisé à l'ouvrir");

$texte = fread($fh,
3); fferme($fh);
echo $texte;
?>

J'ai demandé trois caractères dans l'appel fread, donc le programme affiche ce qui
suit :

Lin

La fonction fread est couramment utilisée avec des données binaires. Mais si vous
l'utilisez sur des données textuelles qui s'étendent sur plus d'une ligne, n'oubliez
pas de compter les caractères de retour à la ligne.

Copie de fichiers
Essayons la fonction de copie PHP pour créer un clone de testfile.txt.
TapezExemple 7-7et enregistrez-le sous copyfile.php, puis appelez le
programme dans votre navigateur.
Exemple 7-7. Copierun fichier
<?php // fichier de copie.php
copier('fichiertest.txt','testfile2.txt') or die("Impossible de copier le fichier");
echo "Fichier copié avec succès dans 'testfile2.txt'" ;
?>

Si vous vérifiez à nouveau votre dossier, vous verrez que vous avez
maintenant le nouveau fichier testfile2.txt dedans. Au fait, si vous ne voulez
pas que vos programmes se terminent lors d'une tentative de copie
infructueuse, vous pouvez essayer la syntaxe alternative dansExemple 7-8.
Exemple 7-8. Syntaxe alternativepour copier un fichier
<?php // copiefichier2.php
si(!copy('testfile.txt', 'testfile2.txt')) echo "Impossible de copier le fichier" ; else
echo "Fichier copié avec succès dans 'testfile2.txt'" ;
?>

Déplacer un fichier
Jomplus unefichier,réNomjetesprithtilrenommereFonction,unesjen Eexemple 7-9.
Exemple 7-9.Déplacer un fichier
<?php// déplacerfichier.php
si(!rename('testfile2.txt', 'testfile2.new')) echo
"Impossible de renommer le fichier" ;
autreecho "Fichier renommé avec succès en 'testfile2.new'" ;
?>

OuiousCalifornien utilisertilrenommereFonction au
répertoires,too.JouneannuleruneNew YorkguerreSi le fichier d'origine n'existe
pas, vous pouvez d'abord appeler la fonction file_exists pour vérifier.

Suppression d'un fichier


La suppression d'un fichier consiste simplement à utiliser la fonction de déconnexion
pour le supprimer dele système de fichiers, comme dansExemple 7-10.
Exemple 7-10. Suppressionun fichier
<?php // deletefile.php
si(!unlink('testfile2.new')) echo "Impossible de supprimer le
fichier" ; else echo "Fichier 'testfile2.new' supprimé avec succès" ;
?>
ATTENTION
Chaque fois que vous accédez directement à des fichiers sur votre disque dur, vous devez
également toujours vous assurer qu'il est impossible que votre système de fichiers soit
compromis. Par exemple, si vous supprimez un fichier en fonction de l'entrée de l'utilisateur,
vous devez vous assurer qu'il s'agit d'un fichier qui peut être supprimé en toute sécurité et
que l'utilisateur est autorisé à le supprimer.

Comme pour le déplacement d'un fichier, un message d'avertissement


s'affichera si le fichier n'existe pas, ce que vous pouvez éviter en utilisant
file_exists pour vérifier d'abord son existence avant d'appeler unlink.

Mise à jour des fichiers


Souvent, vous voudrez ajouter plus de données à un fichier enregistré, ce que
vous pouvez faire dans de nombreuxfaçons. Vous pouvez utiliser l'un des modes
d'écriture par ajout (voirTableau 7-5), ou vous pouvez simplement ouvrir un
fichier pour la lecture et l'écriture avec l'un des autres modes prenant en charge
l'écriture, et déplacer le pointeur de fichier à l'endroit correct dans le fichier dans
lequel vous souhaitez écrire ou lire.
Le pointeur de fichier est la position dans un fichier à laquelle le prochain
accès au fichier aura lieu, qu'il s'agisse d'une lecture ou d'une écriture. Ce n'est
pas la même chose que le descripteur de fichier (commestocké dans la variable
$fh dansExemple 7-4), qui contient des détails sur le fichier en cours d'accès.
Vous pouvez voir cela en action en tapantExemple 7-11et enregistrez-le sous
update.php. Ensuite, appelez-le dans votre navigateur.
Exemple 7-1 . Mise à jour d'un dossier
<?php // mise à jour.php
$fh =fopen("testfile.txt", 'r+') ou die("Impossible d'ouvrir le fichier");
$texte = fgets($fh);

fseek($fh, 0, SEEK_END);
fécrire($fh,"$text") or die("Impossible d'écrire dans le
fichier"); fferme($fh);

echo"Fichier 'testfile.txt' mis à jour avec succès" ;


?>

Ce programme ouvre testfile.txtpour la lecture et l'écriture en réglant le mode


avec'r+',wqui mettilfile aiguillericombatunettildémarrer.jettpoule les
usagestilfgets
fonction de lecture en une seule ligne du fichier (jusqu'au premier saut de
ligne). Après cela, la fonction fseek est appelée pour déplacer le pointeur de
fichier jusqu'à la fin du fichier, à quel point la ligne de texte qui a été extraite
depuis le début du fichier (stockée dans
$text) est ensuite ajouté à la fin du fichier et le fichier est fermé. Le
fichier résultant ressemble maintenant à ceci :

Ligne1
Ligne2
Ligne3
Ligne1

La première ligne a été copiée avec succès puis ajoutée à la fin du fichier.
Comme utilisé ici, en plus du descripteur de fichier $fh, la fonction fseek a reçu
deux autres paramètres, 0 et SEEK_END. SEEK_END indique à la fonction de
déplacer le pointeur de fichier à la fin du fichier et 0 lui indique de combien de
positions il doit ensuite être déplacé vers l'arrière à partir de ce point. Dans le cas
deExemple 7-11, la valeur 0 est utilisée, car le pointeur doit rester à la fin du
fichier.
Il existe deux autres options de recherche disponibles pour la fonction fseek :
SEEK_SET et SEEK_CUR. L'option SEEK_SET indique à la fonction de définir
le pointeur de fichier sur la position exacte donnée par le paramètre précédent.
Ainsi, l'exemple suivant déplace le pointeur de fichier à la position 18 :

fseek($fh, 18, SEEK_SET);

SEEK_CUR définit le pointeur de fichier sur la position actuelle plus la


valeur du décalage donné. Par conséquent, si le pointeur de fichier est
actuellement à la position 18, l'appel suivant le déplacera à la position
23 :

fseek($fh, 5, SEEK_CUR);

Bien que cela ne soit pas recommandé sauf si vous avez des raisons très
précises, il est même possible d'utiliser des fichiers texte comme celui-ci (mais
avec des longueurs de ligne fixes) commebases de données de fichiers plats
simples. Votre programme peut alors utiliser fseek pour se déplacer dans un tel
fichier pour récupérer, mettre à jour et ajouter de nouveaux enregistrements. Vous
pouvez également supprimer des enregistrements en les écrasant avec zéro
caractère, et ainsi de suite.
Verrouillage de fichiers pour plusieurs accès
Les programmes Web sont souvent appelés par de nombreux utilisateurs en même
temps. Si plusieurs personnes tentent d'écrire simultanément dans un fichier, celui-
ci peut être corrompu. Et si une personne y écrit pendant qu'une autre le lit, le
fichier est correct mais la personne qui le lit peut obtenir des résultats étranges.
Pour gérer les utilisateurs simultanés, vous devez utiliser la fonction flock de
verrouillage de fichier. Cette fonction met en file d'attente toutes les autres
demandes d'accès à un fichier jusqu'à ce que votre programme libère le verrou.
Ainsi, chaque fois que vos programmes utilisent un accès en écriture sur des
fichiers auxquels plusieurs utilisateurs peuvent accéder simultanément, vous devez
également leur ajouter un verrouillage de fichier, comme dansExemple 7-12, qui
est une version mise à jour deExemple 7-11.
Exemple 7-12. Mise à jourun fichier avec verrouillage de fichier
<?php
$fh =fopen("testfile.txt", 'r+') ou die("Impossible d'ouvrir le fichier");
$texte = fgets($fh);

si (troupeau($fh, LOCK_EX))
{
fseek($fh, 0, SEEK_END);
fécrire($fh,"$text") or die("Impossible d'écrire dans le
fichier"); flock($fh, LOCK_UN);
}

fferme($fh);
echo"Fichier 'testfile.txt' mis à jour avec succès" ;
?>

Il existe une astuce pour le verrouillage des fichiers afin de préserver le


meilleur temps de réponse possible pour les visiteurs de votre site Web :
effectuez-le directement avant une modification que vous apportez à un
fichier, puis déverrouillez-le immédiatement après. Le fait de verrouiller un
fichier plus longtemps que cela ralentira inutilement votre application. C'est
pourquoi les appels à affluerjen Eexemple 7-12 are directement avant
deunendaprèsrtilbrefeappel.
Le premier appel àflock définit un verrou de fichier exclusif sur le fichier
référencé par $fh
en utilisant le paramètre LOCK_EX : flock($fh, LOCK_EX);
À partir de ce moment, aucun autre processus ne peut écrire (ou même lire) sur
lefichier jusqu'à ce que vous libériez le verrou en utilisant le paramètre
LOCK_UN, comme ceci :
flock($fh, LOCK_UN);
Dès que le verrou est relâché, les autres processus sont à nouveau autorisés à
accéder au fichier. C'est une des raisons pour lesquelles vous devez rechercher
à nouveau le point auquel vous souhaitez accéder dans un fichier chaque fois
que vous avez besoin de lire ou d'écrire des données, car un autre processus
aurait pu modifier le fichier depuis le dernier accès.
Cependant, avez-vous remarqué que l'appel pour demander un verrou exclusif
est imbriqué dans une instruction if ? En effet, flock n'est pas pris en charge
sur tous les systèmes ; il est donc sage de vérifier si vous avez réussi à
sécuriser un verrou, juste au cas où il ne pourrait pas être obtenu.
Une autre chose que vous devez considérer est que le troupeau est ce qu'on
appelle unconsultatiffermer à clé. Cela signifie qu'il verrouille uniquement les
autres processus qui appellent la fonction. Si vous avez un code qui va
directement dans et modifie les fichiers sans implémenterverrouillage de
fichier flock, il remplacera toujours le verrouillage et pourrait faire des
ravages sur vos fichiers.
Soit dit en passant, la mise en œuvre du verrouillage de fichier puis son omission
accidentelle dans une section de code peut entraîner un bogue extrêmement
difficile à localiser.

ATTENTION
flock ne fonctionnera pas sur NFS et de nombreux autres systèmes de fichiers en
réseau. Aussi,lors de l'utilisation d'unserveur multithread comme ISAPI, vous ne pourrez
peut-être pas compter sur flock pour protéger les fichiers contre d'autres scripts PHP exécutés
dans des threads parallèles de la même instance de serveur. De plus, flock n'est pris en charge
sur aucun système utilisant l'ancien système de fichiers FAT (comme les anciennes versions de
Windows).

Lire un fichier entier


Une fonction pratique pour lire un fichier entier sans avoir à utiliser de
descripteurs de fichiers est file_get_contents. Il est très facile à utiliser, comme
vous pouvez le voir dansExemple 7-13.
Exemple 7-13. Utilisation de file_get_contents
<?php
echo "<pré>" ; // Active l'affichage des sauts
de ligne echo file_get_contents("testfile.txt");
echo"</pré>" ; // Termine la balise pré
?>

Mais la fonction est en réalité beaucoup plus utile que cela, car vous pouvez
également utiliser
pour récupérer un fichier à partir d'un serveur sur Internet, comme
dansExemple 7-14, lequeldemande le code HTML à partir de la page d'accueil
O'Reilly, puis l'affiche comme si l'utilisateur avait surfé jusqu'à la page elle-même.
Le résultat sera similaire àIllustration 7-1.
Exemple 7-14. Accéder à la page d'accueil d'O'Reilly
<?php
echofile_get_contents("http://oreilly.com");
?>

Illustration 7-1. La page d'accueil d'O'Reilly saisie avec file_get_contents

Télécharger des fichiers


Le téléchargement de fichiers sur un serveur Web est un sujet qui semble
intimidant pour beaucoup de gens, mais cela ne pourrait en réalité pas être
beaucoup plus facile. Tout ce que vous avez à faire pour télécharger un fichier
à partir d'un formulaire est de choisir un type spécial d'encodage appelé
multipart/form-data, et votre navigateur se chargera du reste. Pour voir
comment cela fonctionne, tapez le programme dansExemple 7-15et
enregistrez-le sous upload.php. Lorsque vous l'exécutez, vous verrez un
formulaire dans votre navigateur qui vous permet de télécharger un fichier de
votre choix.
Exemple 7-15. Téléchargeur d'images upload.php
<?php //upload.php
echo <<<_END
<html><head><title>PHPTéléchargement de formulaire</title></head><body>
<formemethod='post' action='upload.php' enctype='multipart/form-data'>
Sélectionnez le fichier : <input type='file' name='filename' size='10'>
<entréetype='soumettre' value='Télécharger'>
</form>
FINIR;

si ($FILES)
{
$nom= $_FILES['filename']['name'] ;
move_uploaded_file($_FILES['filename']['tmp_name'], $name);
echo "Image téléchargée '$nom'<br><img src='$nom'>" ;
}

echo"</body></html>" ;
?>

Examinons ce programme une section à la fois. La première ligne de la


multiligneL'instruction echo démarre un document HTML, affiche le titre,
puis démarre le corps du document.
Nous arrivons ensuite au formulaire qui sélectionne la méthode POST de
soumission du formulaire, définit la cible des données publiées sur le programme
upload.php (le programme lui-même) et indique au navigateur Web que les
données publiées doivent être encodées via le type de contenu de multipart/form-
data.
Une fois le formulaire configuré, les lignes suivantes affichent l'invite
"Sélectionner un fichier :", puis demandent deux entrées. La première
demande concerne un fichier ; il utilise un type de fichier d'entrée, un nom
denom de fichier,unendunenjeentréechampréesprith uneWidth de
dixcpersonnages.
La deuxième entrée demandée est simplement un bouton Soumettre auquel est
attribué le libellé Télécharger (qui remplace le texte du bouton par défaut de
Soumettre la requête). Et puis le formulaire est fermé.
Ce court programme montreune technique courante dans la programmation
Web dans laquelle un seul programme est appelé deux fois : une fois lorsque
l'utilisateur visite une page pour la première fois, et une autre fois lorsque
l'utilisateur appuie sur le bouton Soumettre.
Le code PHP pour recevoir les données téléchargées est assez simple, car tous les
fichiers téléchargés sont placés dans le tableau système associatif $_FILES. Par
conséquent, une vérification rapide pour voir si $_FILES contient quelque chose
est suffisante pour déterminer si l'utilisateur a téléchargé un fichier. Ceci est fait
avec la déclaration si
($_FILES).
La première fois que l'utilisateur visite la page, avant de télécharger un fichier,
$_FILES est vide, donc le programme ignore ce bloc de code. Lorsque l'utilisateur
télécharge un fichier, le programme s'exécute à nouveau et découvre un élément
dans le tableau $_FILES.
Une fois que le programme se rend compte qu'un fichier a été téléchargé, le
nom réel, tel que lude l'ordinateur de téléchargement, est récupéré et placé dans la
variable $name. Maintenant, tout ce qui est nécessaire est de déplacer le fichier de
l'emplacement temporaire dans lequel PHP a stocké le fichier téléchargé vers un
emplacement plus permanent. Pour ce faire, nous utilisons la fonction
move_uploaded_file, en lui transmettant le nom d'origine du fichier, avec lequel il
est enregistré dans le répertoire courant.
Fienfin,til téléchargéje suisgejes affichéesprithinunenJE
SUISgtag,unendtilresultimesdevrait ressemblerIllustration 7-2.

ATTENTION
jeF toirONUtle sien programmeunendtpoulerecevoirjeguerreningmessagesseuhunes
Autorisationrefusé pour l'appel de fonction move_uploaded_file, il est possible que
vous n'ayez pas défini les autorisations correctes pour le dossier dans lequel le
programme s'exécute.

Illustration 7-2. Téléchargementune image


en tant que données de formulaire
Utilisation de $_FILES
Cinq éléments sont stockés dans le tableau $_FILES lorsqu'un fichier est
téléchargé, comme indiqué dansTable 7-6 (wicifile jestilfile téléchargerchampré
Nomsfourni partilsformulaire de soumission).

Tableau 7-6. Le contenu du tableau $_FILES

Élément de tableau Contenu

$_FILES['fichier']['Nom'] Jil Nom detil téléchargéfile(e.g.,smiley.jpg)

$_FILES['fichier']['taper'] Jilccontenutoui detilfile(e.g.,je


suisâge/jpeg)
$_FILES['fichier']['Taille'] Jilfichier'stailleejen octets

$_FILES['fichier']['nom_tmp']Le nom du fichier temporaire


stocké sur le serveur
$_FILES['fichier']['Erreur'] Jilse tromperoucoderesultantenomtilfile télécharger

Les types de contenu étaient autrefois connus sous le nom de types MIME
(Multipurpose Internet Mail Extension), mais comme leur utilisation s'est
ensuite étendue à l'ensemble d'Internet, ils sont désormais souvent appelés
types de média Internet.Tableau 7-7montre quelques-uns des plus
fréquemment utilisétouitchapeauturne en hautjen$_FILES['fichier']['type'].

Tableau 7-7. Certains types de contenu multimédia Internet courants

application/pdfimage/gif multipart/form-datatexte/xml

application/zipimage/texte jpeg/css vidéo/mpeg

audio/mpeg image/png texte/html vidéo/mp4

audio/x-wav image/tifftexte simple vidéo/quicktime

Validation
J'espère qu'il va maintenant sans dire (bien que je le fasse quand même) que la
validation des données de formulaire est de la plus haute importance, en raison
de la possibilité que des utilisateurs tentent de pirater votre serveur.
En plus des données d'entrée formées de manière malveillante, certaines des
choses que vous devez également vérifier sont si un fichier a bien été reçu et,
si c'est le cas, si le bon type de données a été envoyé.
Compte tenu de tout cela,Exemple 7-16, upload2.php, est une réécriture de
télécharger.php.
Exemple 7-16. Une version plus sécurisée de upload.php
<?php // upload2.php
echo <<<_END
<html><head><title>PHPTéléchargement de formulaire</title></head><body>
<formemethod='post' action='upload2.php' enctype='multipart/form-data'>
Sélectionnez un fichier JPG, GIF, PNG ou TIF :
<entréetype='file' name='filename' size='10'>
<entréetype='submit' value='Télécharger'></form>
FIN ;

si ($FILES)
{
$nom= $_FILES['filename']['name'] ;

switch($_FILES['filename']['type'])
{
Cas'image/jpeg' : $ext = 'jpg'; Pause; case
'image/gif' : $ext = 'gif' ; Pause; cas
'image/png' : $ext = 'png' ; Pause; case
'image/tiff' : $ext = 'tif' ; Pause; défaut:
$ext= ''; Pause;
}
si ($ext)
{
$ n= "image.$ext" ;
move_uploaded_file($_FILES['filename']['tmp_name'], $n); echo
"Image téléchargée '$name' en tant que '$n' :<br>" ;
echo"<img src='$n'>" ;
}
autreecho "'$name' n'est pas un fichier image accepté" ;
}
autreecho "Aucune image n'a été téléchargée" ;

echo"</body></html>" ;
?>

La section de code non HTML a été étendue à partir de la demi-douzaine de lignes


deExemple 7-15à plus de 20 lignes, à partir de if ($_FILES).
Comme avec la version précédente, cette ligne if vérifie siles données étaient
en faitaffiché, mais il y a maintenant un autre correspondant près du bas du
programme qui fait echo à un message à l'écran lorsque rien n'a été téléchargé.
Dans l'instruction if, la variable $name se voit attribuer la valeur du nom de fichier
tel qu'il est extrait de l'ordinateur de téléchargement (comme auparavant), mais
cette fois, nous ne nous fierons pas à l'utilisateur qui nous a envoyé des données
valides. Au lieu de cela, une instruction switch est utilisée pour vérifier le type de
contenu téléchargé par rapport aux quatre types d'image pris en charge par ce
programme. Si une correspondance est établie, la variable $ext est définie sur
l'extension de fichier à trois lettres pour ce type. Si aucune correspondance n'est
trouvée, le fichier téléchargé n'est pas d'un type accepté et la variable $ext est
définie sur la chaîne vide "".
La section de code suivante vérifie ensuite la variable $ext pour voir si elle
contient une chaîne et, si c'est le cas, crée un nouveau nom de fichier appelé $n
avec le nom de base image et l'extension stockée dans $ext. Cela signifie que le
programme contrôle totalement le nom du fichier à créer, car il ne peut s'agir que
de image.jpg, image.gif, image.png ou image.tif.
Sachant que le programme n'a pas été compromis, le reste dele code PHP est
sensiblement le même que dans la version précédente. Il déplace l'image
temporaire téléchargée vers son nouvel emplacement, puis l'affiche, tout en
affichant également les anciens et les nouveaux noms d'image.

REMARQUE
Ne vous inquiétez pas d'avoir à supprimer le fichier temporaire créé par PHP pendant le
processus de téléchargement, car si le fichier n'a pas été déplacé ou renommé, il sera
automatiquement supprimé à la fermeture du programme.

Après l'instruction if, il y a un else correspondant, qui est exécuté uniquementsi


un type d'image non pris en charge a été téléchargé, auquel cas il affiche un
message d'erreur approprié.
Lorsque vous écrivez vos propres routines de téléchargement de fichiers, je
vous conseille fortement d'utiliser une approche similaire et d'avoir des noms
et des emplacements pré-choisis pour les fichiers téléchargés.
De cette façon, aucune tentative d'ajout de noms de cheminet d'autres données
malveillantes aux variables que vous utilisez peuvent passer. Si cela signifie
que plusieurs utilisateurs peuvent se retrouver
ayant un fichier téléchargé avec le même nom, vous pouvez préfixer ces
fichiers avec le nom de leur utilisateur ou les enregistrer dans des dossiers
créés individuellement pour chaque utilisateur.
Mais si vous devez utiliser un nom de fichier fourni, vous devez le nettoyer en
n'autorisant que les caractères alphanumériques et le point, ce que vous pouvez
faire avec la commande suivante, en utilisant une expression régulière
(voirChapitre 17) pour effectuer une recherche et un remplacement sur
$name :

$nom= preg_replace("[^A-Za-z0-9.]", "", $nom);

Cela ne laisse que les caractères A–Z, a–z, 0–9 et les points dans la chaîne $name,
et supprime tout le reste.
Encore mieux, pour vous assurer que votre programme fonctionnera sur tous
les systèmes, qu'ils soient sensibles ou non à la casse, vous devriez
probablement utiliser la commande suivante à la place, qui change tous les
caractères majuscules enminuscules en même temps : $name =
strtolower(ereg_replace("[^A-Za-z0-9.]", "", $name));

REMA
RQUE
Sparfois toimamanyecompteurtilmoidiatoui de image/pjpeg,wquijeindique une
JPEG progressif, mais toiCaliforniencoffre-fortyunejjtle siento toncodeunesunenautress de
images/jpeg,liketle sien:
Cas'image/pjpeg' :
Cas'image/jpeg' : $ext = 'jpg'; Pause;

Appels système
Parfois, PHP n'aura pas la fonction dont vous avez besoin pour effectuer une
certaine action, mais le système d'exploitation sur lequel il s'exécute peut le faire.
Dans de tels cas, vous pouvez utiliser l'appel système exec pour faire le travail.
Par exemple, pour visualiser rapidement le contenu du répertoire en cours,
vous pouvez utiliser un programme tel queExemple 7-17. Si vous êtes sur un
système Windows, il fonctionnera tel quelà l'aide de la commande dir de
Windows. Sous Linux, Unix ou Mac OS X, commentez ou supprimez la première
ligne et décommentez la seconde pour utiliser le système ls
commander. Vous pouvez taper ce programme, l'enregistrer sous exec.php et
l'appeler
dans votre navigateur.
Exemple 7-17. Exécution d'une commande système
<?php // exec.php
$ cmd= "répertoire" ; //les fenêtres
//$cmd = "ls" ; // Linux, Unix & Mac

exec(escapeshellcmd($cmd), $output, $status);

if ($status) echo "La commande Exec a


echoué" ; autre
{
echo "<pré>" ;
foreach($sortiecomme $ligne) echo htmlspecialchars("$ligne\n");
echo "</pre>" ;
?>

JilhtmlspecialcharsFonctionjesappelerrétoturneuneNew
Yorksspécialcpersonnagesrettransformés par le système en ceux que HTML peut
comprendre et afficher correctement, ce qui affine la sortie. Selon le système que
vous utilisez, le résultat de l'exécution de ce programme ressemblera à ceci (à
partir d'une commande dir Windows) :

Le volumedans le lecteur C est le


numéro de série du volume du
disque dur est DC63-0E29

Annuairede C:\Program Files (x86)\Zend\Apache2\htdocs

09/02/2014 12:03 <REP> .


09/02/2014 12:03 <REP> ..
28/04/2013 08h30 5 336 chars.php
12/02/2012 13:08 1 406 favicon.
ico
20/01/2014 12:52 4 202 index.
html
09/02/2014 11:49 76 info.p
hp
21/03/2013 09:52 110 test.ht
m
01/04/2013 13:06 182 459 test.ph
p
6Des dossiers) 193 589octets
9Réal(s) 1 811 290 472 448octets gratuits

exec prend trois arguments :


La commande elle-même (dans le cas précédent, $cmd)
Un tableau dans lequel le système mettra la sortie de la commande (dans
le
cas précédent, $sortie)

Une variable pour contenir le statut renvoyé de l'appel (dans le cas précédent,
$statut)

Si vous le souhaitez, vous pouvez omettre les paramètres $output et $status, mais
vous ne connaîtrez pas la sortie créée par l'appel ni même s'il s'est terminé avec
succès.
Ouioussdevraitalso Remarquetil utiliser detilescapeshellcmréFonction.jetjes une
bien habitudeà toujours utiliser lors de l'émission d'un appel exec, car il nettoie la
chaîne de commande, empêchant l'exécution de commandes arbitraires, si vous
fournissez une entrée utilisateur à l'appel.

ATTENTION
Les fonctions d'appel systèmesont généralement désactivés sur les hôtes Web partagés, car ils
présentent un risque de sécurité. Vous devriez toujours essayer de résoudre vos problèmes
avec PHP si vous le pouvez, et n'accéder directement au système que si c'est vraiment
nécessaire. De plus, accéder au système est relativement lent et vous devez coder deux
implémentations si votre application doit s'exécuter à la fois sur les systèmes Windows et
Linux/Unix.

XHTML ou HTML5 ?
Étant donné que les documents XHTML doivent être bien formés, vous pouvez les
analyser à l'aide d'analyseurs XML standard, contrairement au HTML, qui
nécessite un analyseur spécifique HTML indulgent. Pour cette raison, XHTML n'a
jamais vraiment fait son chemin, et lorsque le moment est venu de concevoir une
nouvelle norme, le World Wide Web Consortium a choisi de prendre en charge
HTML5 plutôt que la nouvelle norme XHTML2.
HTML5 possède certaines des fonctionnalités de HTML4 et XHTML, mais est
beaucoup plus simple à utiliser et moins strict à valider et, heureusement, il n'y
a maintenant qu'un seul type de document que vous devez placer en tête d'un
document HTML5 (au lieu du variété de types stricts, transitionnels et de jeux
de cadres précédemment requis), à savoir :

<!DOCTYPEhtml>
conçu pour HTML5 et, comme toutes les dernières versions des navigateurs
les plus populaires prennent en charge la plupart des spécifications HTML5
depuis 2011 environ, ce type de document est généralement le seul dont vous
avez besoin, sauf si vous choisissez de répondre aux navigateurs plus anciens.
À toutes fins utiles, lors de l'écriture de documents HTML, les développeurs Web
peuvent ignorer en toute sécurité les anciens types et syntaxe de document
XHTML (comme l'utilisation de <br
/> au lieu de la balise <br> plus simple). Mais si vous devez vous occuper
d'un navigateur très ancien ou d'une application inhabituelle qui s'appuie
sur XHTML, vous pouvez obtenir plus d'informations sur la façon de
procéder surhttp://xhtml.com.

Des questions
1. Quelle conversion printfspécificateur utiliseriez-vous pour afficher un
nombre à virgule flottante ?
2. OchapeauimpressionFétat moiNTcvieux être
utilisétotaketiljeentréetring"Happton anniversaire"unend
sortirtiltring"**Content"?

3. Pour envoyer la sortiede printf à une variable au lieu d'un navigateur,


quelle fonction alternative utiliseriez-vous ?
4. Comment créeriez-vous un horodatage Unix pour 7h11 le 2 mai 2016 ?
5. Quel mode d'accès aux fichiers utiliseriez-vous avec fopen pour ouvrir un
fichier en mode écriture et lecture, avec le fichier tronqué et le pointeur de
fichier au début ?
6. Quelle est la commande PHP pour supprimer le fichier file.txt ?
7. Quelle fonction PHP est utilisée pour lire un fichier entier en une seule
fois, même depuis le Web ?

8. Quelle variable superglobale PHP contient les détails sur les fichiers téléchargés ?
9. Quelle fonction PHP permet l'exécution des commandes système

Vous aimerez peut-être aussi