Débuter avec PHP

Cyril FABBY

Ce cours s'attachera à vous présenter les éléments de base du langages PHP. Bien que vous trouverez quelques exemples qui serviront à illustrer mes propos, l'objectif n'est pas ici de vous permettre d'écrire des scripts complexes.
En revanche, Vous pourrez vous référer à ce document chaque fois que vous aurez un doute sur la syntaxe à utiliser.
Si nous comparions l'apprentissage de PHP à l'apprentissage d'un langage naturel comme l'anglais ou le latin (oui, pourquoi pas), ce document pourrait s'apparenter à un aide mémoire sur la grammaire.

- Titre : Débuter avec PHP

- Auteur : Cyril FABBY

- Parution : 22 novembre 2006

- Licence : Copyright ® 2006 Cyril FABBY. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Qu'est-ce que PHP ?

- I-B. Pourquoi PHP ?

- I-C. Objectifs de ce cours

- I-D. Pré-requis

- II. Généralités

- II-A. Qu'est-ce qu'un script

- II-B. PHP et HTML, qui fait quoi ?

- III. Syntaxe de PHP

- III-A. Les commentaires

- III-B. Les constantes

- III-C. Les variables

- III-C-1. Définition des variables

- III-C-2. Les types de variables

- III-C-2-1. Les variables simples (types scalaires)

- III-C-2-1-1. Les types de variables numériques

- III-C-2-1-2. Les variables de chaîne

- III-C-2-1-3. Les booléens

- III-C-2-2. Les variables composées (types structurés)

- III-C-2-2-1. Les tableaux (généralités)

- III-C-2-2-2. Les tableaux indicés

- III-C-2-2-3. Les tableaux associatifs

- III-C-2-2-4. Les objets

- III-D. Les opérateurs

- III-D-1. Généralités sur les opérateurs

- III-D-2. Les opérateurs arithmétiques

- III-D-3. Les opérateurs d'incrémentation/décrémentation

- III-D-4. Les opérateurs booléens

- III-D-5. Les opérateurs de chaînes de caractères

- III-D-6. Les opérateurs de tableau

- III-D-7. Les opérateurs de comparaison

- III-D-8. Les opérateurs condensés

- III-D-9. La priorité des opérateurs

- III-E. Les structures de contrôle

- III-E-1. Les structures de test

- III-E-2. Les structures de boucle

- III-F. Les Fonctions

- IV. Pour aler plus loin avec la notion de variable

- V. Réutiliser du code déjà écrit

- VI. Interaction entre PHP et le navigateur du client

I - Introduction

I-A - Qu'est-ce que PHP ?

[TODO]

I-B - Pourquoi PHP ?

I-C - Objectifs de ce cours

Ce cours a pour ambition de vous mettre à l'aise avec le langage PHP. L'objectif n'est bien sûr pas de faire de vous un expert PHP mais il vous permettra déjà de savoir de quoi vous parlez.
Les exemples et morceaux de codes proposés concernent PHP4 mais la plupart sont valables dans les autres versions (les exceptions seront signalées).

Le propos de cet article est évidemment d'apprendre à utiliser PHP. Même s'il s'agit d'un langage comme un autre, la motivation principale de cet article est de vous premettre de créer des pages web dynamiques.

I-D - Pré-requis

Pour pouvoir mettre en pratique ce qui suit, vous aurez besoin d'un environnement capable d'interpréter le langage de script PHP (->tuto).
Un éditeur de texte quelconque vous permettra d'écrire votre code. Si celui-ci vous permet de colorer votre code, n'hésitez pas car c'est beaucoup plus facile de repérer un grand nombre d'erreur de frappe de manière immédiate.
Même si ce n'est pas obligatoire, un navigateur internet pourra vous permettre de visualiser le résultat de vos scripts .En effet, même si PHP est principalement utilisé pour créer des pages dynamiques, il s'agit avant tout d'un langage de script dont l'utilisation peut être beaucoup plus générale, mais ne nous égarons pas et entrons dans le vif du sujet...
Pour certains chapitres de ce cours, il serait également bienvenue d'avoir un minimum de notions sur le langage HTML (->tuto).

II - Généralités

II-A - Qu'est-ce qu'un script

Un script est une suite d'instructions qui sont éxécutées de manière séquentielle, c'est-à-dire, les unes après les autres.

L'instruction constitue donc l'unité de base pour décrire les actions que doit réaliser le script. Il est possible de regrouper ces instructions en "bloc" d'instructions. Ce bloc peut effectuer une série d'instruction et peut alors être vu comme une instruction plus complexe que vous auriez vous même définie à partir des instructions de bases que vous propose le langage de script PHP. Si la notion de bloc vous paraît encore abstraite, ne vous inquiéter pas car nous y reviendrons au moment de présenter les structures de contrôles. Les exemples vous permettront d'appréhender ce concept.

En PHP, chaque instruction doit être terminée par le caractère ";". Vous pouvez donc écrire plusieurs instructions sur une seule ligne pourvu que vous les sépariez par des points-virgules. Toutefois, cela aura tendance à rendre votre code compact et peu lisible. Je vous recommande donc de vous contenter d'une instruction par ligne et aussi d'aérer votre code en sautant des lignes et en utilisant des espaces (sans trop éxagérer non plus).

Il est aussi possible d'écrire une instruction sur plusieurs lignes. Si vous devez faire des comparaisons complexes dans vos scripts, certaines instructions auront tendances à nécessiter beaucoup de caractères...
Avec le point-virgule qui marque la fin de l'instruction, vous pouvez, sans aucune ambigüité, répartir vos instructions sur plusieurs lignes. Elles seront plus faciles à relire par la suite que si vous deviez constamment utiliser l'ascenceur horiontal de votre éditeur pour voir le bout de vos lignes de code.

un script quelconque...

instruction_1;
instruction_2;
instruction_3;
...
dernière_instruction;

II-B - PHP et HTML, qui fait quoi ?

Si vous avez eu envie d'apprendre le langage de script PHP, peut-être est-ce parce que vous avez déjà eu l'occasion d'écrire quelques pages HTML et que vous avez ressenti quelques frustrations vis à vis de ce langage. Le langage HTML est très puissant pour structurer et présenter des documents mais seul, il ne vous permet pas d'interagir avec vos lecteurs.

Si vous avez déjà eu la curiosité d'afficher le code source des pages web que vous visitez, vous avez pu constater que jamais n'apparaît une seule ligne de php.

Pourquoi ?
Parce que PHP est interprété sur le serveur qui héberge la page que vous demandez. L'interprétation a généré du code HTML et c'est ce code que vous pouvez voir.
Qu'est-ce que cela veut dire ?
Ça veut dire que quelque soit la complexité du traitement que vous aurez à faire pour arriver à vos fins, le but du jeu est de créer du texte qui sera en fait un document HTML compréhensible pour votre navigateur.

Ceci étant dit, je vous présente le premier script mélant PHP et HTML. Si vous avez déjà appris un autre langage de programmation, vous m'avez vu venir. Il s'agit du célèbre "Bonjour le monde" (je vous le sers en français).

Le premier script PHP

<html>
<head><title>Le premier script</title></head>
<body>
<?php
echo 'Bonjour le monde';
?>
</body>
</html>

Votre navigateur va afficher quelque chose qui ressemblera très sensiblement à ceci.

Nous pouvons voir ce qu'à reçu le navigateur en affichant la source.
Vous obtenez cela:

Contenu que reçoit le navigateur qui appelle cette page...

<html>
<head><title>Le premier script</title></head>
<body>
Bonjour le monde
</body>
</html>

Comme annoncé plus haut, nous constatons que nous avons à faire à un document HTML classique.

Voyons pas à pas ce qui se passe quand votre navigateur appelle ce script.
Nous constatons que le début a tout l'air d'un document HTML "conventionnel". Et pour cause, c'est exactement ça.
Après la balise HTML <body>, nous rencontrons un petit nouveau: la balise ouvrante <?php.
Cette balise indique que nous allons rencontrer du code PHP et que l'interpréteur va devoir commencer à travailler.
A l'inverse, la balise fermante ?> indique que nous en avons fini avec le code PHP et que nous revenons à du code HTML.

Entre ces deux balises, nous observons notre première instruction PHP. Il s'agit de l'instruction echo qui permet d'écrire dans votre document la chaîne de caractère qui la suit. Cette chaîne de caractère peut se trouver entre apostrophes 'chaine de caractère', ou guillemet "chaine de caractère". Nous verrons un peu plus loin quelle est la différence entre ces deux notations.
L'instruction print( 'Bonjour le monde' ) est, à notre niveau, complétement équivalente. Je vous laisse décider celle que vous préférez. Le sujet a été maintes fois débattu, et si cela vous interesse, je vous laisse chercher. Taper php echo vs print dans n'importe quel moteur de recherche devrait vous permettre de trouver un certain nombre de ressources sur le sujet, mais ceci dépasse largement le cadre de ce cours.

Le fait que le fichier soit nommé avec l'extension ".php" suffit à indiquer à l'interpréteur que, potentiellement, ce document peut contenir du code PHP qu'il faudra alors interpréter.
Un fichier ayant l'extension " .php " et ne contenant que du HTML ne posera aucun problème et enverra au client la page tel qu'elle est écrite.

Je concluerai cette partie en insistant une dernière fois sur le rôle de PHP et HTML qui bien qu'imbriqués dans le script, n'en sont pas moins indépendants l'un de l'autre.
Voici un exemple que je vous conseillerai de ne pas reproduire mais qui explicite mon propos.

Un script pour le moins obscur...

<htm<?php
echo 'l>';
?>

<?php
echo '<head><ti';
echo 'tle>Quelle drôle de façon pour écrire une page...</';
echo 'title></hea';
?>d>
<body<?php
echo '>Bonjour quand même...<';
?>/body>
</html>

Votre navigateur recevra le document suivant:

Finalement...

<html>
<head><title>Quelle drôle de façon pour écrire une page...</title></head>
<body>Bonjour quand même...</body>
</html>

Chronologie:

- Vous faites appel à un script PHP grâce à votre navigateur (vous émettez une requête) ;

- Le serveur reçoit votre requête et interprête le script correspondant ;

- Un document est généré par le serveur, ce document vous est envoyé (il s'agit de la réponse à votre requête) ;

- Le document reçu va être interprété par votre navigateur pour afficher la page : il se trouve qu'il s'agit d'un document HTML.

En résumé, à chacun sa tâche. Le PHP concerne le serveur et produit du texte alors que le HTML concerne votre navigateur et sert à structurer un document.

Nous avons vu comment PHP pouvait être utilisé pour générer un document ou une partie d'un document.
Dans la suite de ce cours, nous allons voir ce que PHP met à notre disposition afin d'écrire des scripts un peu plus complexes et dont l'interêt sera un peu plus évident. Une simple salutation peut démontrer votre bonne éducation, mais ce n'est surement pas pour celà que vous êtes entrain de lire ce cours.

III - Syntaxe de PHP

Pour vous exprimer dans un langage naturel, vous devez connaître les noms, les adjectifs, les verbes... Vous devez aussi pouvoir associer ces mots afin de donner un sens à votre propos. Pour ce faire, vous utilisez la grammaire du langage. En PHP comme dans tout autre langage de programmation, c'est la même chose, vous vous faites comprendre en utilisant la grammaire du langage, autrement dit, la syntaxe.
La comparaison s'arrête au fait qu'un humain est capable de comprendre des sous-entendus, des métaphores, etc. Le style global du discours peut aussi permettre de nuancer le message. Vous ne trouverez pas ce genre de subtilité dans les langages de programmation car l'ordinateur doit comprendre de manière univoque ce que vous lui demandez de faire, les ambigüités ne sont pas permises. La conséquence est que maîtriser la syntaxe d'un langage informatique est beaucoup plus simple que de maîtriser la grammaire d'un langage naturel.
Donc si vous arrivez à vous faire comprendre de votre entourage, vous avez tout à fait les capacités d'apprendre n'importe quel langage informatique, il vous suffit de connaître les éléments de syntaxes autorisés.

La syntaxe de PHP s'inspire fortement de la syntaxe de langage comme le C, le perl ou le java. Si vous avez déjà rencontré un de ces langages, vous ne serez certainement pas dépaysés.

Il faut noter que ce langage est sensible à la casse. C'est-à-dire que l'interpréteur PHP fait la diférence entre une lettre minuscule et la même lettre en majuscule. Certains éléments comme le nom des fonctions (nous verrons plus loin de quoi il s'agit) n'y sont pas sensibles mais il est plus simple de considérer que PHP est entièrement sensible à la casse. Ceci évitera des erreurs d'inattentions qui peuvent être difficiles à détecter.

III-A - Les commentaires

Une fois que vous aurez faits vos premiers scripts et que vous vous sentirez plus à l'aise, vous allez vouloir essayer de faire des scripts plus complexes.
Il faudra peut-être gérer plusieurs fichiers ou alors de nombreuses lignes de code. Vous devrez revenir sur certaines portions du code il faudra se souvenir de qui fait quoi, et où.

Les commentaires permettent d'annoter votre code. Ils vous serviront à expliciter certains passages de vos scripts et à laisser des informations qui vous seront utiles si vous devez remanier votre code. Quand l'interpréteur rencontre un commentaire, celui-ci est tout simplement ignoré. Les commentaires ne s'adressent qu'à la personne humaine qui lira le code du script.
Ils participent donc à une bonne structuration du code dans le sens qu'ils permettent de mieux comprendre le pourquoi et le comment de votre script.

PHP offre trois façons d'insérer des commentaires:

Commentaires dans un script

<?php

// ceci est un commentaire sur une seule ligne qui commence par "//"
# il y a une autre façon de faire pareil en utilisant "#" mais cette manière est déconseillée

/*
Il est également possible de faire des commentaires sur plusieurs lignes.
Tout ce qui se trouve dans ces limites est ignoré.
Même ceci: <?php ?>
Si vous essayez de commenter des fractions de codes
pour debugger, attention à ne pas imbriquer les blocs
de commentaire
*/

// un bloc de commentaire commence par "/*"
echo "je ne suis pas un commentaire";
// et se termine par "*/"

// les deux commentaires précédents nous font remarquer
// que tout ce qui suit les signes "//" et "#" n'est pas
// interprété, y compris les délimiteurs de blocs de
// commentaire...

?>

Quelques conseils pour bien utiliser les commentaires:

- Toujours utiliser les commentaires de lignes pour écrire un commentaire qui explique ou décrive le code qui suit ;

- N'utiliser les commentaires de blocs que pour masquer une portion de code en cas de débuggage ;

- Seuls les commentaires de bloc vous permettront de masquer une portion de code qui mêlerait PHP et HTML.

- Les commentaires HTML ne masquent pas le code PHP, et pour cause, au moment ou le serveur s'occupe du PHP, ce qui n'est pas du php n'a aucun sens particulier pour l'interpréteur.

Si vous suivez ces conseils, vous ne devriez avoir aucun problème.
Je me rappelle, lorsque j'ai commencé à utiliser PHP, l'éditeur que j'utilisais colorais aussi bien le HTML que le PHP. J'ai perdu plusieurs heures car la coloration du code laisser penser que certaines portions étaient des commentaires alors que l'interpréteur ne voyait pas cela de la même façon. Depuis que je me suis imposé ces quelques règles, je n'ai plus eu de soucis de cet ordre là.
Ne blâmons pas les éditeurs car la coloration du code apporte tout de même un confort non négligeable.
La coloration de plusieurs langages imbriqués peut être assez complexes. Ce n'est pas la peine de pousser vos éditeurs dans leurs derniers retranchements...

III-B - Les constantes

Une constante permet d'associer un symbole (un nom) à une valeur. Le fait d'utiliser ce symbole dans votre script sera équivalent à avoir écrit cette valeur.

Interêt de l'utilisation de constantes:

- vous pouvez donner un nom significatif à une valeur. Si vous devez faire des calculs de géométrie, vous pourriez avoir besoin de la constante PI;

- si vous devez par la suite modifier la valeur de la constante, vous n'aurez à le faire qu'en un seul endroit.

En PHP, une constante est introduite par le mot-clef define.

<?php

define ( 'PI', 3.1416 );

?>

valeur peut être un numérique, une chaîne de caractère, ou une autre constante.

En PHP, le nom d'une constante doit obéir à certaines règles.

Règles de nommage d'une constante en PHP:

- le nom des constantes commence par une lettre ou alors le caractère '_' ;

- le reste du nom peut comporter des lettres, des chiffres et le caractère '_' ;

- par convention, on a l'habitude de mettre le nom des constantes en majscules.

III-C - Les variables

Une variable vous permet de stocker n'importe quelle valeur que vous auriez calculée ou définie afin de la réutiliser ou de la modifier. Contrairement aux constantes, leur valeur peut varier au cours du script.

III-C-1 - Définition des variables

Comme les constantes, le nom des variables doit obéir à certaines règles.

Règles de nommage d'une variable en PHP:

- une variable est introduite par le caractère '$' ;

- le caractère '$' est suivi d'une lettre ou du caractère '_' ;

- le reste du nom peut contenir des lettres, des chiffres et le caractère '_'.

Pour lui assigner une valeur, il suffit, à la suite de votre variable d'écrire l'opérateur d'assignation puis la valeur que vous voulez lui donner. L'opérateur d'assignation est le caractère '='.

<?php

$compte_a_rebours = 10;

?>

Nous avons ici déclaré la variable '$compte_a_rebours' et lui avons donner la valeur 10. On dit que cette variable est initialisée à 10 (on lui donne une valeur avant toute utilisation).
En voyant le nom de cette variable, on peut imaginer que quelque part dans votre script vous aurez un compte à rebours et que cette variable va sûrement changer de valeur régulièrement pour arriver jusqu'à 0.
Comme pour les constantes, donner un nom significatif à votre variable vous aidera à mieux comprendre votre script si vous devez vous y replonger plus tard.

Nous allons voir juste après qu'une variable ne se contente pas de contenir que des chiffres.

III-C-2 - Les types de variables

III-C-2-1 - Les variables simples (types scalaires)

III-C-2-1-1 - Les types de variables numériques

Vous pouvez utiliser des valeurs entières ou réelles. Par anglicisme, nous dirons que nous avons à faire à des integer ou des float.

Si vous débutez en programmation, vous utiliserez certainement de manière naturelle des nombres en bases décimales. Plus tard, vous ressentirez peut-être le besoin de manipuler d'autres bases. Le langage PHP vous permet d'écrire des entiers en base 8, 10 ou 16 (respectivement octal, décimal, héxadécimal).

<?php

$int = 1;        // 1 en notation décimale
$int = 011;      // 9 en notation octale, le premier caractère est le chiffre zéro, pas le caractère 'O'
$int = 0x11;     // 17 en notation hexadécimale, le premier caractère est le chiffre zéro

?>

Les nombres réels sont écrits en séparant la partie décimale de la partie entière par un point et non une virgule (il s'agit de l'écriture anglaise). Vous pouvez utilisez la notation exponentielle pour écrire vos nombres réels.

<?php

$flt = 3.14157;    // numérique flottant
$flt = 0.3e-2;    // numérique flottant en notation exponentielle, correspond à 0.003

?>

Un nombre qui serait le résultat de la division de 1 par 3 donnerait 0 suivi d'une infinité de 3 derrière la virgule.
Vous comprendrez donc aisément qu'il n'est pas possible de représenter ce chiffre de manière exacte. Si vous faîtes des calculs plus ou moins compliqués sur des nombres flottants, vous devrez garder à l'esprit que la précision sera limitée.

Le code qui suit, faîtes-moi confiance, demande à PHP d'afficher un nombre flottant en écrivant 30 décimales.

<?php

printf( "%.30f", 1/3 );

?>

Chez moi, ce code affiche cette valeur:
0.333333333333333303727386009996
Vous voyez qu'au delà d'une certaine précision, on ne peut plus faire confiance à PHP. Le calcul est un sujet bien plus complexe qu'il n'y parait et des langages lui sont complétement dédiés. Ce n'est pas avec PHP que nous allons envoyer une fusée sur la lune...

III-C-2-1-2 - Les variables de chaîne

Les chaînes de caractères s'écrivent entre guillemets ou entre apostrophes.
La différence tient dans le fait qu'entre guillemets, une variable sera interprétée.

Les chaînes de caractères

<?php

$libelle = 'Le message';
$contenu = 'le contenu du message';

$pour_affichage = "$libelle : $contenu";
// $pour_affichage contient la chaîne:
// 'Le message : le contenu du message'

$autre_chose = '$libelle : $contenu';
// $autre_chose contient la chaîne:
// '$libelle : $contenu'

?>

Si vous écrivez une chaîne de caractère sans variable à l'intérieur, utilisez des apostrophes. Ceci permettra à PHP d'économiser la recherche d'une variable qu'il ne trouvera de toute façon pas...

Comme dans certains autres langages, PHP reconnaît certaines séquences d'échappement, il s'agit de caractères qui auront un sens particulier. Ces caractères sont introduits par le caractère '\' (antislash).
Ces séquences d'échappements ne sont reconnus qu'entre guillemets. Entre apostrophes, ces séquences n'auront pas de sens particulier et s'afficheront telles que vous les avez écrites.

Les séquences d'échappements:

- \n permet d'insérer un retour à la ligne ;

- \r permet d'insérer un retour chariot ;

- \t permet d'insérer une tabulation.

Le caractère '\' ayant donc un sens spécial, si on veut l'afficher, il faudra le doubler. "\\" affichera \. "\\\\" affichera \\ etc. Cette technique, contrairement aux séquences d'échappement précedemment citées, fonctionne aussi bien entre apostrophes que doubles.

Gardez à l'esprit qu'hormis entre les balises HTML <pre> et </pre>, ce genre de mise en forme n'influence pas l'affichage de votre document HTML. En revanche, cela aura une influence sur la source de ce document qui en sera plus lisible.

Si vous rencontrez quelques incohérences d'affichages pour des portions d'HTML que vous auriez générées grâce à un script, vous aurez sûrement intérêt à jeter un oeil au code HTML produit.

Pour ne pas s'emmêler les pinceaux entre les apostrophes et les guillemets :
Entre apostrophes, vous pouvez écrire des guillemets. En suivant le même principe, que les séquences d'échappement, vous pouvez également écrire des apostrophes qui ne fermeront pas la chaîne de caractères. Il suffit, encore une fois, de faire précéder l'apostrophe par le caractère \.
En ce qui concerne les guillemets, vous pouvez reprendre la phrase précédente en remplaçant le mot "simple" par "double", et vice-versa...

Quelques exemples d'utilisation des apostrophes et guillemets dans les chaînes de caractères

// une chaîne entre apostrophes
$msg1 = 'cette chaîne entre apostrophes peut contenir des guillemets: " mais aussi des apostrophes \' ';

// une chaîne entre guillemets
$msg2 = "cette chaîne entre guillemets peut contenir des apostrophes: ' mais aussi des guillemets \" ";

// une chaîne contenant le caractère \
$msg3 = "pour ce faire, il faut utiliser le caractère antislash une fois: \\";

III-C-2-1-3 - Les booléens

L'algèbre booléenne fait partie d'un domaine de la logique dans lequel les expressions sont soit vraies soit fausses. On peut composer ces expressions pour en créer de nouvelles. On utilise pour cela les tables de vérité.
Si vous commencez à programmer (quel que soit le langage) vous devrez à un moment ou un autre maîtriser cette notion. Si ce n'est pas encore le cas, (->tuto), pas d'inquiétude, il y a peu de choses à savoir.

Jusqu'à la version 4.1 de PHP, le type booléen n'était pas explicitement défini.

Dans les expressions booléennes, la notion FAUX peut correspondre à:

- Le numérique 0 ;

- La chaîne de caractère vide '' ;

- La chaîne de caractère '0'.

Dans le cadre d'une expression booléenne, tout le reste sera considéré comme VRAI, y compris la chaîne de caractère 'FAUX'. Je vous laisse méditer la dessus.

Les constantes true et false sont prédéfinies en PHP. Je vous recommande de les utiliser.

III-C-2-2 - Les variables composées (types structurés)

Les types scalaires que nous venont de voir vous permettront déjà de commencer à faire des choses intéressantes. Cependant, si vous manipulez un grand nombre de données et que, de plus, ces données peuvent avoir un rapport entre elles, il pourrait être utile de regrouper ces données afin de les manipuler de manière plus efficace.

III-C-2-2-1 - Les tableaux (généralités)

Les tableaux vous permettent de ranger différentes valeurs dans une seule variable. Leur utilisation est très souple et permet de faire beaucoup de choses.
Ces valeurs pourront être manipulées (ajoutées, modifiées ou juste consultées ) grâce à leur index.
Le tableau peut contenir tout ce que vous pourriez avoir l'idée de stocker dans une variable. Que ce soit les types que nous avons déjà passés en revue, d'autres tableaux ou encore d'autres types dont nous n'avons pas encore parlé. Les éléments ne doivent pas nécessairement être du même type.
Vous pouvez voir un tableau comme une structure dans laquelle vous rangeriez d'autres variables.

Cet index peut être soit une valeur numérique, soit une chaîne de caractère. Dans le premier cas, nous parlons de tableaux indicés (l'index est souvent appelé "indice"), dans le deuxième cas, nous parlons de tableaux associatifs (l'index est souvent appellée "clef").

L'utilisation de ces deux sortes de tableaux est relativement similaire. En fonction de la situation, il pourra être plus indiqué d'utiliser l'une plutôt que l'autre. C'est vous qui jugerez en temps voulu.
Nous verrons des exemples d'utilisation des tableaux dans le chapitre sur les structures de contôle. Dans ce chapitre, je m'attacherai essentiellement à vous montrer comment on peut créer (définir) un tableau en PHP.

III-C-2-2-2 - Les tableaux indicés

Il existe différentes manières de définir un tableau indicé. Dans les exemples qui suivent je tâcherai de vous montrer les différentes manières de définir un tableau dont le contenu sera à chaque fois identique. Vous verrez ainsi quelles sont les différentes méthodes que vous pouvez utiliser.

Création de tableaux indicés

<?php

// 1ère méthode
$tab[0] = 1;
$tab[1] = 'deuxième élement';
$tab[2] = true;

// 2ème méthode
$i = 0;
$j = 1;
$k = 2;

$tab[$i] = 1;
$tab[$j] = 'deuxième élément';
$tab[$k] = true;

// 3ème méthode
$tab[] = 1;
$tab[] = 'deuxième élément';
$tab[] = true;

// 4ème méthode
$tab = array( 1, 'deuxième élément', true);

?>

Explications de ces méthodes:

- 1ère méthode:
Ici, vous indiquez directement l'indice de l'élément que vous voulez définir. Cet indice est indiqué entre crochet à la suite du nom de variable de votre tableau ($tab ici).

- 2ème méthode:
Cette méthode est très similaire à la différence non négligeable près que les indices que vous indiquez sont des valeurs contenues dans d'autres variables. Vous pouvez donc décider de ranger les éléments du tableau à construire en calculant leur indice d'une manière qui vous est propre.

- 3ème méthode:
Avec cette méthode, vous n'indiquez pas l'indice entre les crochets. Alors PHP comprendra que vous lui demandez de rajouter l'élément à la suite du dernier élément déjà défini.

- 4ème méthode:
Cette méthode utilise une fonction prédéfinie en PHP array() (nous verrons plus loin que vous pouvez créer vos propres fonctions en PHP, mais chaque chose en son temps). Cette fonction accepte un nombre variable d'arguments ( que nous indiquons entre les parenthèses ). Chaque argument est séparé des autres par une virgule. En résultat de la fonction, vous obtenez un tableau rempli avec les éléments que vous avez passés en arguments (dans l'ordre dans lequel vous les avez passés).
En informatique, lorsqu'il s'agit de numéroter les choses, l'habitude consiste à compter en partant de zéro. C'est ici le cas.
Si vous ne donnez aucun argument, vous obtiendrez "logiquement" un tableau vide. Nous expliquerons un peu plus loin comment certaines variables peuvent exister sans ne rien contenir, et surtout, en quoi est-ce utile. Cela peut être un peu délicat à appréhender lorsque l'on commence à programmer.

La 4ème méthode crée un tableau et l'affecte à votre variable qui se trouve à gauche du signe "=". Si votre variable contenait déjà quelque chose (un tableau ou autre chose), le contenu est perdu car vous le remplacez par le nouveau tableau. On dit aussi que le contenu a été écrasé par le nouveau tableau.

Avec les 3 premières méthodes vous définissez les éléments un par un, en indiquant leur indice (de manière explicite ou non). Si l'élément contenu à cet indice existait déjà, vous l'écrasez. En revanche le reste du tableau n'est pas modifié. Si aucun élément à cet indice n'existait auparavant, alors vous venez de le créer.

Vous êtes tout à fait libre de mélanger les méthodes pour définir les différents éléments d'un même tableau.Si, quand vous écrivez un script, vous restez bien conscient de ce que je viens de vous expliquer, vous n'aurez pas de souci.
En fonction de ce que fait votre script, vous ne devriez pas à avoir à mélanger les méthodes, mais plutôt à en préférer une plutôt que l'autre dans le contexte précis où vous vous trouvez.
Si vous avez bien compris ce qui précède, et si vous avez bien réussi à concevoir le résultat que vous voulez obtenir, vous devriez naturellement savoir quelle méthode est la plus adaptée à chaque situation.

Attention!
Vous voyez que PHP autorise une grande souplesse quant à la définition des tableaux. Cette souplesse peut vous faciliter la vie dans bien des cas.

Quand on peut faire tout et n'importe quoi, l'interêt est de pouvoir tout faire, le risque est de faire n'importe quoi. Je ne dis pas ça pour faire de la philosophie facile (ce n'est pas mon domaine de toutes façons) mais plutôt pour commencer à répondre aux questions que vous avez peut-être commencé à vous poser concernant la définition d'un tableau indicé.

Je vous ai dit qu'il était tout à fait possible de mélanger les méthodes précédentes pour définir un tableau.
Que se passe-t-il alors si nous mélangeons un peu tout ça ?

Instructions PHP

Contenu du tableau

Commentaires

// ici je construirai un tableau en utilisant différentes
// combinaisons des méthodes présentées ci-dessus.

// les exemples sont indépendants les uns des autres.

Ici, je décrirai le contenu du tableau obtenu sous la forme suivante:
[indice] => valeur contenue

Ici, j'expliquerai ce qu'il peut être utile de retenir

$tab = array( 'un', 'deux', 'trois' );

[0] => un
[1] => deux
[2] => trois

On constate, qu'en dehors de tout autre précision, la numérotation des indices commence à 0.

$tab = array( 'un', 'deux', 'trois' );
$tab[1] = 'quatre';

[0] => un
[1] => quatre
[2] => trois

Le contenu de l'élément d'indice 1 (initialement 'deux') a été écrasé par la valeur 'quatre'.

$tab[] = 'un';
$tab[] = 'deux';
$tab[] = 'trois';

[0] => un
[1] => deux
[2] => trois

Si on ne précise pas les indices, la numérotation des indices commence encore à 0.

$tab[10] = 'un';
$tab[] = 'deux';
$tab[] = 'trois';

[10] => un
[11] => deux
[12] => trois

La première instruction impose explicitement que le premier élément du tableau ait l'indice 10.
On constate donc que, lorsque on ne précise pas l'indice (notation avec les crochets seulement). PHP utilise comme indice, la valeur du plus grand indice défini et ajoute 1.
A la deuxième instruction, le plus grand indice défini est 10, PHP crée donc l'indice 11 pour cet élément.
A la troisième instruction, le plus grand inidice défini est maintenant 11...

$tab[] = 'un';
$tab[10] = 'deux';
$tab[] = 'trois';
$tab[15] = 'quatre';
$tab[] = 'cinq';
$tab[20] = 'six';
$tab[] = 'sept';

[0] => un
[10] => deux
[11] => trois
[15] => quatre
[16] => cinq
[20] => six
[21] => sept

Cet exemple confirme ce qu je vous ai dit pour l'exemple précédent.
On voit aussi que le fait que les indices ne se suivent pas ne pose pas de problème à PHP.

$tab[2] = 'un';
$tab[3] = 'deux';

$tab = array( 'trois', 'quatre' );

[0] => trois
[1] => quatre

On voit que l'utilisation de la fonction array() ne permet pas d'ajouter des éléments à un tableau qui existerait éventuellement déjà. Elle crée un tableau de toutes pièces.

Lorsque vous manipulerez votre tableau, vous aurez tantôt envie de manipuler le tableau entier, ou alors un élément précis.
De la même façon qu'il existe la fonction array() pour créer un tableau, de nombreuses fonctions existent en PHP qui vous permettent de manipuler vos tableaux.

III-C-2-2-3 - Les tableaux associatifs

Je vous ai dit plus haut que la différence entre les tableaux indicés et les tableaux associatifs résidait dans le fait que, pour les tableaux associatifs, les index utilisés sont des chaînes de caractères et non des valeurs numériques.
La création et la manipulation des tableaux associatifs est à peu près identique. Concrètement, la principale diffrence tiendra finalement dans l'utilisation que vous aller faire de vos tableaux.

Lorsque dans une administration quelconque nous remplissons un formulaire, nous avons d'une part des intitulés et d'autre part des champs à remplir. Les intitulés indiquent d'une certaine façon ce qui est attendu dans le champ.
C'est un peu le principe du tableau associatif. Il peut parfois être intéressant de nommer l'information contenue par un élément. Ne serait-ce que pour utiliser cette information. Dans la suite de ce cours, j'utiliserai le nom clef pour me réferrer au nom de cette information.

Voici quelques méthodes que vous pouvez utiliser pour créer un tableau associatif.

Création de tableaux indicés

<?php
// 1ère méthode
$tab['prenom'] = 'John';
$tab['nom'] = 'Crith';
$tab['age'] = 33;

// 2ème méthode
$champ1 = 'prenom';
$champ2 = 'nom';
$champ3 = 'age';

$tab[$champ1] = 'John';
$tab[$champ2] = 'Crith';
$tab[$champ3] = 33;

// 3ème méthode
$tab = array( 'prenom' => 'John', 'nom' = 'Crith', 'age' => 33 );
?>

Je vous laisse constater la similitude avec la création des tableaux indicés.

Peut-être est-il utile d'apporter quelques précisions sur la 3ème méthode...

Vous avez sans doute remarqué que nous utilisons la même fonction array() que pour la création des tableaux indicés. La différence à l'air de se trouver dans les arguments que nous fournissons à la fonction.
Ici aussi, chaque argument est séparé des autres par une virgule.
Chaque argument est en fait de la forme:
'nom_de_la_clef' => 'valeur_de_l_element'

Lors de la création de tableaux indicés avec la fonction array(), nous ne précisions pas la valeur des indices. Et nous avons vu alors que PHP générait lui même les index. Ici nous indiquons de manière explicite les index à utiliser.
Pour preuve, dans l'exemple qui suit, je vais créer un tableau indicé avec la fonction array(). En empruntant la syntaxe que je viens de vous montrer pour les tableaux associatifs, je peux choisir la valeur des indices de manière explicite.

Instructions PHP

Contenu du tableau

Commentaires

$tab = array( '1' => 'un', '5' => 'cinq' );

[1] => un
[5] => cinq

Ceci nous montre que les tableaux indicés ne sont en fait qu'un cas particulier des tableaux associatifs.
L'intérêt est que ceci nous permet d'avancer:
Tout ce que nous pouvons faire avec un tableau associatif, nous pouvons aussi le faire avec un tableau indicé (l'inverse n'est pas nécessairement vrai).

III-C-2-2-4 - Les objets

Je n'approfondirai pas ce sujet pour ne pas avoir à expliciter un certain nombre de notions qui alourdiraient le propos de ce cours. Si cette notion d'objet vous interesse vous trouverez de nombreuses ressources sur ce site expliquant tout cela.

Pour ne pas trop frustrer votre esprit curieux, j'indiquerai juste ceci:
Comme pour les tableaux associatifs, les objets permettent de stocker différentes valeurs que nous nommons pour les différencier. Dans le contexte d'un objet, ces données sont appelées des propriété, la notion sous-jacente est la même que celle de 'clef' dans les tableaux associatifs.
En plus de ces données, l'objet nous permet aussi de définir des opérations de traitement qui utiliseront les propriétés afin de, soit les modifier, soit les consulter, soit créer un résultat. Dans le contexte d'un objet, ces opérations de traitement sont appelées les méthodes.
Je ne donnerai pas plus de détails car il y aurait beaucoup trop à dire. Apprenons doucement mais surement.

Pour aller plus loin avec la notion d'objet (->tuto)

III-D - Les opérateurs

Nous avons vu, dans le chapitre précédent, quels types de données nous pouvions manipuler ainsi que la manière de les définir en PHP.
Avec les opérateurs, nous allons voir comment PHP peut manipuler ces données. En effet, ce que nous avons dit jusqu'à maintenant nous permet de définir un certain nombre de choses. Cependant, il serait interessant de pouvoir faire intervenir ces données dans les traitements que feront vos scripts.
Certains des opérateurs que nous allons étudier vous seront certainement très familiers puisque ce seront les mêmes que ceux que nous apprenons à manier dans nos premières années à l'école. A savoir les opérateurs arithmétiques ou encore de calculs (addition, soustraction,etc.). D'autres mériteront quelques explications supplémentaires.

III-D-1 - Généralités sur les opérateurs

Les opérateurs vont vous permettre de travailler sur vos données. Les données manipulées sont alors appelées opérandes.
Concrètement, les opérandes que vous utiliserez seront soit des valeurs que vous indiqueriez directement, soit des constantes, soit des variables ou encore le résultat d'une autre opération.

Je ne vous l'avez pas encore précisé, mais dans ce cours, j'ai à de nombreuses reprises utilisé un opérateur.
Il s'agit de l'opérateur d'assignation '='.

Cet opérateur nécessite d'être utilisé avec deux opérandes.
L'opérande de gauche doit être une variable.
L'opérande de droite doit contenir une valeur qui sera assignée à l'opérande de gauche.

Opérateur d'assignation

<?php
$a = 5;
// la valeur 5 a été assigné à la variable $a

$b = $a;
// la valeur de de la variable $a (5 dans notre exemple) a été assigné à la variable $b

$chiffre_pair = array( 0, 2, 4, 6, 8 );
// le tableau, résultat de la fonction array(), a été assigné à la variable $chiffre_pair
?>

Nous allons voir, dans les chapitres suivants, les opérateurs les plus courants que PHP nous permet d'utiliser.
Vous remarquerez sans doute que plusieurs fois, je vous présenterai des opérateurs comme étant différents mais s'écrivant de la même manière.

Comment l'interpréteur PHP peut-il faire la différence ?
En fait, il y a une différence. Le contexte dans lequel est écrit l'opérateur permet à PHP de savoir quelle opération est demandée. Par contexte, j'entends par exemple, le nombre d'opérandes qui vont avec l'opérateur ou encore le type de ces opérandes ( une valeur numérique, un tableau, etc.)

III-D-2 - Les opérateurs arithmétiques

Les opérateurs arithmétiques vont vous permettre d'effectuer les opérations élémentaires de calcul.
Ces opérateurs doivent travailler avec des valeurs numériques ou encore des variables contenant une valeur numérique.
Vous pouvez utiliser indiféremment des types entiers ou à virgule.

Opérateur

Syntaxe

Explication

Négation

-$a

L'opérateur renvoie l'opposé de la valeur assignée à la variable $a.

Addition

$a + $b

L'opérateur renvoie la somme des valeurs assignées aux variables $a et $b.

Soustraction

$a - $b

L'opérateur renvoie la différence des valeurs assignées aux variables $a et $b.
La différence avec l'opérateur de négation est que nous avons, ici, deux opérandes.

Multiplication

$a * $b

L'opérateur renvoie le produit des valeurs assignées aux variables $a et $b.

Division

$a / $b

L'opérateur renvoie le quotient des valeurs assignées aux variables $a et $b.

Modulo

$a % $b

L'opérateur renvoie le reste de la division entière de la valeur de la variable $a par la valeur de la variable $b.

La division 14 / 5 donne 2,4 alors que le résultat de la division entière est 2.
Dans le premier cas, on peut écrire l'égalite: 5 x 2,4 = 14
Dans le second cas, il faudrait écrire l'égalité: 5 x 2 + 4 = 14
Ici, 4 est le reste de la division entière est c'est la valeur que nous renverrai l'opération: 14 % 5

Si vous donnez comme opérandes des chaînes de caractères, PHP tentera de convertir vos chaînes de caractères en valeur numérique.
Si le début de votre chaîne de caractère contient un chiffre valide, alors PHP utilisera cette valeur.
Dans tous les autres cas, PHP utilisera la valeur 0.

Chaînes de caractères dans des opérations arithmétiques

<?php

$a = '9';
$b = '4';

echo $a + $b;
// Ceci affichera 13

$a = 2;
$b = 'trois';
echo $a + $b;
// La variable $b ne contient rien qui pourrait être interprété comme un chiffre.
// La valeur utilisée est alors 0 et le résultat affiché est 2 (correspond à l'opération: 2 + 0)

$a = '3 pommes';
$b = '2 idées';
$c = 'et 4 machins aussi';
echo $a + $b + $c;
// Chacune des variables $a et $b commence par un chiffre valide.
// Dès qu'un caractère non valide pour un chiffre est trouvé dans la chaîne,
// PHP abandonne l'analyse de la chaîne et utilise le chiffre déjà interprété.
//
// Pour la variable $c, le premier caractère est invalide pour un chiffre.
// Bien qu'un caractère valide soit présent dans la chaîne, PHP aura arrêté l'analyse avant de le rencontrer.
// La valeur utilisée sera donc 0.
//
// Le résultat affiché est donc 5 (correspond à l'opération: 3 + 2 + 0)

?>

III-D-3 - Les opérateurs d'incrémentation/décrémentation

Ajouter ou enlever la valeur 1 à une autre valeur est courant en programmation (pour simuler un compteur ou un compte à rebours par exemple).

On donne à ces opérations le nom...

- incrémentation quand on ajoute 1 à une valeur ;

- décrémentation quand on retire 1 à une valeur.

Ces opérateurs accepte comme opérande une variable.
Cette variable doit être de type numérique (entier ou à virgule).
L'utilisation d'autres type ne provoqueront pas d'erreur mais peut fournir des résultats peu prévisibles...

Ces opérateurs peuvent être utilisées sur une variable, même si cette variable est déjà utilisée dans une opération.
Dans ce cas, il est possible d'indiquer à PHP si il doit d'abord évaluer l'opération puis l'incrémentation ou l'inverse.
Tachez de ne pas embrouiller votre esprit avec des constructions trop complexes. Vous pourrez quoiqu'il arrive écrire l'équivalent sur deux lignes. Ce sera normalement plus clair quand vous vous relirez.

Opérateur

Syntaxe

Explication

Post-incrémentation

$b = $a++;

On utilise la valeur de $a pour l'assigner à la variable $b. Ensuite, la valeur de $a est modifiée (ajoute 1).

Post-décrémentation

$b = $a--;

On utilise la valeur de $a pour l'assigner à la variable $b. Ensuite, la valeur de $a est modifiée (retire 1).

Pré-incrémentation

$b = ++$a;

La valeur de $a est modifiée (ajoute 1). C'est la valeur modifiée qui est assignée à la variable $b.

Pré-décrémentation

$b = --$a

La valeur de $a est modifiée (enlève 1). C'est la valeur modifiée qui est assignée à la variable $b.

Les exemples suivant vous permettront de vérifier que vous avez bien compris ces notions.

Exemple

Explication

$a = 5;

echo $a;
echo $a++;
echo $a;

Nous assignons tout d'abord la valeur 5 à la variable $a.
La première instruction echo affiche logiquement 5.
Qu'en est-il pour la deuxième ?
Il s'agit d'une post-incrémentation, l'incrémentation est donc réalisée après l'interprétation de l'instruction echo. La valeur 5 sera encore affichée.
La dernière instruction echo nous permet de vérifier que l'incrémentation a bien eu lieu, elle affiche 6.

Ces quelques lignes afficheront: 556.

$a = 5;

echo $a;
echo ++$a;
echo $a;

La différence avec l'exemple précédent est que, à la deuxième instruction, nous avons utilisé l'opérateur de pré-incrémentation. L'incrémentation a donc lieu avant l'évaluation de l'instruction echo. Cette ligne affiche donc 6.

Ces quelques lignes afficheront: 566.

En terme de résultat, les codes suivants sont équivalent deux à deux. Le code de gauche fournit le même résultat que le code de droite.

Exemple

Équivaut à

$a = 5;

echo $a++;

$a = 5;

$a = $a +1;
echo $a;

$a = 5;

echo ++$a;

$a = 5;

echo $a;
$a = $a +1;

III-D-4 - Les opérateurs booléens

Nous avons vu, auparavant, le type booléen. Les opérateurs booléens, vont vous permettre de travailler avec ces types.
Ces opérateurs renvoient une valeur de type booléen.

Dans le tableau ci-après, je vous présenterai les opérateurs booléens et leur signification. Certains opérateurs acceptent deux syntaxes, je vous les présenterai le cas échant.
Pour être plus à l'aise avec le maniement de l'algèbre booléen, je vous renvoie aux autre articles que vous pourrez trouver sur ce site (->tuto)

Opérateur

Syntaxe

Explication

Négation

!$a

Si la variable $a a la valeur true, alors l'opérateur renvoie false et inversement.

ET logique

$a && $b ou
$a and $b

Si les variables $a et $b ont la même valeur, alors l'opérateur renvoie true. Sinon, l'opérateur renvoie false.

OU logique

$a || $b ou
$a or $b

Si au moins une des valeurs des variable $a et $b est true, alors l'opérateur renvoie true. Sinon, l'opérateur renvoie false.

OU exclusif

$a xor $b

L'opérateur ne renvoie vrai que si les valeurs des variables $a et $b sont différentes.
Sémantiquement parlant, il s'agit du même 'ou' que l'on trouve sur les menus dans les restaurants.
Si vous prenez une formule et que pour l'entrée vous voyez écrit "Assortiment de charcuterie ou Salade niçoise", vous n'aurez que l'un des deux choix. Si dans un restaurant on peu négocier et avoir un peu des deux, ce n'est pas le cas avec l'algèbre booléen...

III-D-5 - Les opérateurs de chaînes de caractères

Le seul opérateur de chaîne de caractères en PHP est l'opérateur de concaténation. La concaténation consiste à créer une chaîne de caractères à partir de plusieurs autres chaînes de caractères.
Par exemple, la concaténation des chaînes 'aa' et 'bb' donnera la chaîne 'aabb'.
Si votre script doit constituer une chaîne de caractères comme résultat de plusieurs traitement, vous utiliserez certainement cet opérateur.

Cet opérateur accepte comme opérandes, soit des variables ayant pour valeur une chaîne de caractères, soit directement une chaîne de caractères.

Opérateur

Syntaxe

Explication

Concaténation

$a.'_suffixe'

L'opérateur renvoie une chaîne de caractères constituée de la chaîne contenue dans la variable $a à laquelle on aurait ajouté la chaîne '_suffixe'.

Nous avons vu plus haut comment définir une chaîne de caractères contenant à la fois des apostrophes et des guillemets. Cet opérateur nous offre une autre façon d'obtenir le même résultat.

Rappels :

- On peut écrire des apostrophes entre guillemets ;

- On peut écrire des guillemets entre apostrophes ;

- On peut écrire des apostrophes entre apostrophes en utilisant le caractère '\' avant ;

- On peut écrire des guillemets entre guillemets en utilisant le caractère '\' avant.

Définition de chaîne de caractères

<?php

// méthode déjà présentée:
$str1 = 'cette chaîne contient des guillemets " et apostrophes \' ...';

// méthode équivalentes utilisant l'opérateur de concaténation:
$str2 = 'cette chaîne contient des guillemets " et apostrophes ' . "'...";

?>

Les deux chaînes définies dans l'exemple précédent auront exactement le même contenu.
La bonne méthode à utiliser est celle qui vous paraît le plus clair et qui vous facilitera la relecture de votre code.
Il serait certainement plus simple de n'utiliser qu'une des deux méthodes et de s'y tenir ensuite.

III-D-6 - Les opérateurs de tableau

En PHP, le seul opérateur qui vous permet de manipuler des tableaux est l'opérateur d'union. Cet opérateur permet de créer un unique tableau constitué des éléments des deux tableaux donnés comme opérandes.

Opérateur

Syntaxe

Explication

Union

$a + $b

L'opérateur renvoie un tableau constitué des éléments présents dans les tableaux $a et $b. Un élément correspond au couple index + valeur.
Si certains index sont définis à la fois dans le tableau $a et le tableau $b, alors ce sont les éléments du tableau $a qui seront renvoyés.

Voici quelques cas d'utilisation de l'opérateur union afin de bien comprendre comment il fonctionne.

Définition des tableaux et opération

Contenu après opération

Commentaires

$tab_1[0] = 'un';
$tab_1[1] = 'deux';

$tab_2[2] = 'trois';
$tab_2[5] = 'quatre';
$result = $tab_1 + $tab_2;

[0] => un
[1] => deux
[2] => trois
[5] => quatre

Il n'y a aucun index en commun. Le tableau résultat contient tous les éléments contenus dans les deux tableaux.
Le dernier élément nous montre que les index ne sont pas re-numérotés mais directement copiés.

$tab_1[0] = 'un (tableau 1)';
$tab_1[1] = 'deux (tableau 1)';

$tab_2[0] = 'un (tableau 2)';
$tab_2[2] = 'deux (tableau 2)';

$result = $tab_1 + $tab_2;

[0] => un (tableau 1)
[1] => deux (tableau 1)
[2] => deux (tableau 2)

L'index 0 est défini dans $tab_1 et dans $tab_2. L'opérateur renverra pour l'index 0 l'élément contenu dans le tableau à gauche de l'opérateur.

$tab_1[0] = 'un (tableau 1)';
$tab_1[1] = 'deux (tableau 1)';

$tab_2[0] = 'un (tableau 2)';
$tab_2[2] = 'deux (tableau 2)';

$result = $tab_2 + $tab_1;

[0] => un (tableau 2)
[1] => deux (tableau 1)
[2] => deux (tableau 2)

Même explication que précédemment. Ici, c'est $tab_2 qui est à gauche de l'opérateur. C'est là que réside la différence entre cet exemple et le précédent.

$tab_1['prenom'] = 'John';
$tab_1['nom'] = 'Crith';

$tab_2[2] = 'question';
$tab_2[3] = 'réponse';

$result = $tab_1 + $tab_2;

[prénom] => John
[nom] => Crith
[2] => question
[3] => réponse

Cet exemple vous montre qu'on peut unir un tableau associatif et un tableau indicé.

III-D-7 - Les opérateurs de comparaison

Les opérateurs de comparaison sont les opérateurs qui vont vous permettre de construire des tests. Vous les utiliserez certainement très souvent.
Vous écrirez une condition et la comparaison, vous donnera vrai ou faux selon que votre condition est réalisée ou non.

Par exemple:
la condition: 3 < 2 vous renverra faux, alors que
la condition: 3 > 2 vous renverra vrai.

Les opérateurs de comparaison renvoient donc une valeur de type booléen.

Vous pouvez comparez toute sorte de valeur (contenue dans une variable ou directement indiqué dans votre code). Les opérandes peuvent avoir n'importe quel type. Dans le chapitre "Pour aller plus loin avec les variables" je décrirai comment PHP compare des valeurs de type différents.
En attendant d'aller plus loin, je vous rappelle que nous avons vu plus haut comment PHP utilisait les chaînes de caractères lorqsqu'il attend une valeur numérique...

Opérateur

Syntaxe

Commentaires

Infériorité stricte

$a < $b

Renvoie vrai si la valeur assignée à la variable $a est inférieure à la valeur assignée à la variable $b.

Infériorité

$a <= $b

Renvoie vrai si la valeur assignée à la variable $a est inférieure ou égale à la valeur assignée à la variable $b.

Supériorité stricte

$a > $b

Renvoie vrai si la valeur assignée à la variable $a est supérieure à la valeur assignée à la variable $b.

Supériorité

$a >= $b

Renvoie vrai si la valeur assignée à la variable $a est supérieure ou égale à la valeur assignée à la variable $b.

Egalité

$a == $b

Renvoie vrai si les valeurs assignées aux variables $a et $b sont égales.
Vous pouvez comparer une valeur numérique et une chaîne de caractères.
2 == '2'; renverra vrai.

Différence

$a != $b

Renvoie vrai si les valeurs assignées aux variables $a et $b sont différentes.
Vous pouvez comparer une valeur numérique et une chaîne de caractères.
2 != '3'; renverra vrai.

Identité

$a === $b

Renvoie vrai si les valeurs assignées aux variables $a et $b sont égales et si les variables $a et $b ont le même type.
2 === '2'; renverra faux.

Non identité

$a !== $b

Renvoie vrai si les valeurs assignées aux variables $a et $b sont différentes ou si les variables $a et $b ont un type différent.
2 !== '2'; renverra vrai.

Une erreur très classique que tout le monde commet à un moment ou un autre, est de confondre l'opérateur d'assignation '=' et l'opérateur d'égalité '=='. En effet leur syntaxe est très proche, même si leur action est complétement différente.
La difficulté est que si vous écrivez l'opérateur d'assignation à la place de l'opérateur d'égalité, PHP ne vous signalera pas d'erreur car vous aurez écrit quelque chose qui sera syntaxiquement correct.

Que se passe-t-il alors ?
Étudions le code suivant:

<?php

$a = 5;
$b = 3;

$c = $a == $b;

?>

Dans ce cas, la variable $c contient le résultat de la comparaison des valeurs des variables $a et $b. Ce qui dans notre cas vaut faux.

Étudions maintenant le même code en remplaçant l'opérateur d'égalité par l'opérateur d'assignation:

<?php

$a = 5;
$b = 3;

$c = $a = $b;

?>

Dans ce code, nous initialisons la variable $a (respectivement $b) à 5 (respectivement 3).
Ensuite, nous assignons la valeur de la variable $b à la variable $a, puis la nouvelle valeur de la variable $a à la variable $c.
Au final, nous avons les variables $a, $b et $c qui contiennent la valeur 5.
Si par la suite, vous utilisez la variable $c dans le cadre d'une expression qui attend une valeur booléenne, alors la valeur 5 correspond à vrai (voir chapitre III-C-2-1-3).

Nous avons donc vu que l'omission d'un seul caractère peut complétement changer le résultat de votre script (dans un cas, $c vaut faux, et dans l'autre, $c vaut vrai)

III-D-8 - Les opérateurs condensés

Dans vos scripts, vous aurez surement besoin, à un moment ou un autre, de modifier la valeur d'une variable en fonction de sa valeur initiale.

Par exemple, pour rajouter 5 à la variable $a, vous pourriez procéder comme suit:

<?php

$a = 3;
// nous initialisons la valeur de la variable $a à 3

$a = $a + 5;
// la valeur assignée à la variable $a est maintenant 8 (3 + 5)

?>

Pour un certain nombre d'opérateurs, PHP offre un raccourci qui vous permettra d'économiser un peu les touches de votre clavier.
Pour un opérateur quelconque op, vous pourriez écrire:
$a op= valeur; qui serait équivalent à $a = $a op valeur

Voici la liste des opérateurs que nous avons déjà vu qui autorise ce genre de raccourcis.

Opérateur

Syntaxe Condensée

Opérateurs arithmétiques

Addition

$a += 5;

Soustraction

$a -= 5;

Multiplication

$a *= 5;

Division

$a /= 5;

Modulo

$a %= 5;

Opérateurs booléen

ET logique

$b &= true;

OU logique

$b |= false;

OU exclusif

$b ^= true;

Opérateur de chaînes de caractères

Concaténation

$c .= ' à la fin de la chaîne';

Opérateur de tableaux

Union

$tab = array( 1, 2 );
$tab += array( 'prénom' => 'John', 'nom' => 'Crith' );

Nous aurions aussi pu classer ces opérateurs dans la famille des opérateurs d'assignation.

III-D-9 - La priorité des opérateurs

Nous avons vu qu'il était tout a fait possible d'écrire des instructions contenant plusieurs opérateurs.

Nous avons appris à l'école que 3 + 5 x 8 donnait 43. En effet, la multiplication étant prioritaire sur l'addition, on effectue d'abord la multiplication puis l'addition entre le résultat de la multiplication et le premier opérande.

PHP utilise cette notion de priorité des opérateurs, et pas uniquement pour les opérateurs arithmétique.
PHP permet également d'utiliser les parenthèses pour forcer l'ordre dans lequel le résultat est évalué.

Évaluation d'une opération avec des parenthèses

<?php

$a = 3 + 5 * 8;
// $a vaut 43

$a = (3 + 5) * 8;
// $a vaut 64. (3 + 5) * 8 équivaut à 8 * 8

$a = 3 + (5 * 8);
// $a vaut 43.
// les parenthèses respectent la priorité naturelle.
// les parenthèses n'apportent donc rien ici, si ce n'est un élément supplémentaire de visibilité

?>

Dans le tableau ci-après, vous trouverez les différents opérateurs que nous avons vu jusque là dans l'ordre de priorité décroissante.
Quand des opérateurs ont la même priorité, vous pouvez utiliser les parenthèses pour lever l'ambigüité.

Opérateurs

Familles

++ --

Incrémentation, décrementation

/ * %

Arithmétique

+ - .

Arithmétique, tableau, chaîne de caractères

< <= > >=

Comparaison

== != === !==

Comparaison

&&

Booléen

||

Booléen

= += -= *= /= %= &= |= ^=

Assignation

and

Booléen

or

Booléen

xor

Booléen

Je vous avais indiqué que certains opérateurs booléens acceptaient deux syntaxes. Nous voyons ici que la différence tient dans la différence de priorité par rapport aux autres opérateurs.

III-E - Les structures de contrôle

III-E-1 - Les structures de test

III-E-2 - Les structures de boucle

III-F - Les Fonctions

IV - Pour aler plus loin avec la notion de variable

V - Réutiliser du code déjà écrit

VI - Interaction entre PHP et le navigateur du client