Académique Documents
Professionnel Documents
Culture Documents
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 :
$x+= 10 ; // Incrémente $x de 10
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 :
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 ;
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 ;
?>
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.
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 ;
$compte = 17,5 ;
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 :
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();
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.
Les noms de variable ne peuvent contenir que les caractères a–z, A–Z, 0–9 et _
(souligner).
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).
* Multiplication $j*11
/ Division $j/4
++ 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 ;
$compte = $compte + 1 ;
Les chaînes ont leur propre opérateur, le point (.), détaillé dans la
sectionConcaténation de chaînes.
= $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.
== Est égal à $j == 4
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) :
&& Et $j == 3&&$k == 2
! Pas ! ($j==k $)
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):
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 :
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;
++$x ;
−−$y ;
En conjonction avec un test (une instruction if), vous pouvez utiliserle code suivant :
si (++$x == 10) echo
$x ;
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 :
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 ;
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 :
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 :
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 :
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 :
$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" ;
- $auteur.";
?>
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 (\).
$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.
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.
la magie
constant La description
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.
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 :
echodate longue(heure());
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());
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.
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.
$_FILES Éléments téléchargés dans le script actuel via la méthode HTTP POST.
$_REQUEST Contenu des informations transmises depuis le navigateur ; par défaut, $_GET,
$_POST et $_COOKIE.
$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.
$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 ?
4. Quel symbole est utilisé pour préfacer toutes les variables PHP ?
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 ?
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)
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.
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.
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>" ;
?>
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;
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
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).
Mission Attribuervaleurs $a = $b + 23
Logique booléen $a et $b
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.
Les Taper
opérateurs)
() Parenthèses
++ −− Incrémenter/décrémente
r
! Logique
*/ % Arithmétique
^ Au niveau du bit
| Au niveau du bit
&& Logique
|| Logique
? : Ternaire
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é.
++ −− Incrémentation et Droit
décrémentation
= += −= *= /= Mission Droit
* Multiplication La gauche
/ Division La gauche
% Module La gauche
?: Ternaire La gauche
, Séparateur La 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 ($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" ;
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 ;
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).
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 ;
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 ;
?>
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.
une b ET OU XOR
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).
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
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).
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" ;
?>
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.
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" ;
?>
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 :
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
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.
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 ;
<?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);
?>
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
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 :
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.
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) pause ;
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 ;
si ($j == 0) continuer ;
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 :
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.
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 ?
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 :
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 :
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).
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.
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.
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 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:
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 :
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));
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 :
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] ;
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.
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" ;
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.
une fonctionfix_names()
{
global$a1 ; $a1 = ucfirst(strtolower($a1));
globale $a2 ; $a2 = ucfirst(strtolower($a2));
globale $a3 ; $a3 = ucfirst(strtolower($a3));
}
?>
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.
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" ;
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" ;
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.
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
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]=>
)
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.
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.
$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" ;
}
}
?>
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" ;
Utilisateur de classe
{
Publique$nom ;
}
?>
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" ;
Utilisateur de classe
{
Publique$nom ;
}
?>
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";
}
}
?>
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 ;
}
}
?>
echo $object->get_password();
Utilisateur de classe
{
statiquefonction pwd_string()
{
echo"S'il vous plait entrez votre mot de passe";
}
}
?>
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 {}
?>
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 ;
// ...
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.
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.
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
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" ;
}
}
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 ;
}
}
?>
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>" ;
}
}
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 :
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();
classerChat sauvage
{
Publique$fourrure ; // Les chats sauvages ont de la fourrure
fonction construction()
{
$this->fur = "TRUE" ;
}
}
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 ?
3. Quelle est la différence entre accéder à une variable par son nom
et par référence ?
8. Quelle syntaxe utiliseriez-vous pour créer une sous-classe à partir d'une classe
existante ?
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.
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
)
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" ;
0 :Photocopieuse
1:Jet d'encre
2 : Laser
3 :photo
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'] ;
?>
p1élément : Laser
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 :
foreach($papiercomme $élément)
{
echo"$j : $élément<br>" ;
++$j ;
}
?>
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");
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
'Balle' =>"Ball
Point", 'hilite' => "Surligneurs",
'marker' => "Marqueurs"),
'divers'=> tableau(
'ruban'
=>"Ruban adhésif",
'colle' =>"Adhésifs", "clips"
=>"Trombones"
)
);
echo "<pré>" ;
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 :
echo$produits['misc']['colle'] ;
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
echo $échiquier[7][3] ;
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" ;
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);
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);
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
)
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);
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" ;
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 :
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);
Des questions
1. Quelle est la différenceentre un tableau numérique et un tableau associatif ?
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("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 :
<é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 :
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 :
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);
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';
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.
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 :
Ou vous souhaiterez peut-être stocker la sortie prête à être affichée plus tard :
echotemps() + 7 24 60* 60 ;
echomktime(0, 0, 0, 1, 1, 2000);
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);
Spécificateurs de jour
Spécificateur de semaine
O Numéro de semaine de l'année 01 à 52
Month spécificateurs
Spécificateurs d'année
y Année, 2 chiffres 00 à 99
Spécificateurs de temps
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".
$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
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.
'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.
$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
$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.
fseek($fh, 0, SEEK_END);
fécrire($fh,"$text") or die("Impossible d'écrire dans le
fichier"); fferme($fh);
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, 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" ;
?>
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).
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");
?>
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>" ;
?>
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.
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'].
application/pdfimage/gif multipart/form-datatexte/xml
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>" ;
?>
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.
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
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) :
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"?
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