Programmation Web II : Cours PHP 2024
Programmation Web II : Cours PHP 2024
Programmation Web II
CODE UE : IGL235
MODULE : Programmation III
CREDITS : 02
CIBLES : GL 2 / GSI 2 / IWD 2
M. Marc TEJIOGNI
Email : mtejiogni@[Link]
Tél : 693 90 91 21 / 682 66 37 31
Programmation Web II 2024 / 2025
PLAN DU COURS
OBJECTIF GENERAL ........................................................................................................................ 6
OBJECTIFS SPECIFIQUES ............................................................................................................... 6
CHAPITRE I : NOTIONS DE BASE EN PHP ................................................................................... 7
Objectif du chapitre.......................................................................................................................... 7
Objectifs spécifiques ........................................................................................................................ 7
I. Définition et principe de fonctionnement ..................................................................................... 7
II.1. Qu’est-ce que PHP ?............................................................................................................. 7
II.2. Script CGI............................................................................................................................. 7
II.3. Principe du modèle Client / Serveur..................................................................................... 9
III. Environnement de Développement Intégré (EDI) ................................................................... 10
IV. Quelques règles à respecter...................................................................................................... 10
V. Ecrire du code PHP ................................................................................................................... 10
VI. Quelques instructions usuelles en PHP .................................................................................... 11
VII. Notions de base....................................................................................................................... 12
VII.1. Les variables .................................................................................................................... 12
VII.1.1. Définition.................................................................................................................. 12
VII.1.2. Déclaration et initialisation d'une variable ............................................................... 12
VII.1.3. Les types de données ................................................................................................ 13
VII.1.4. Déterminer le type de variable ................................................................................. 15
VII.1.5. Tester le type de variable avec gettype..................................................................... 16
VII.2. Les constantes.................................................................................................................. 16
VII.2.1. Définition.................................................................................................................. 16
VII.2.2. Initialiser et afficher une constante........................................................................... 16
VII.2.3. Constantes prédéfinies .............................................................................................. 17
VII.3. Mise en forme de PHP avec HTML et CSS .................................................................... 18
VII.3.1. Définition.................................................................................................................. 18
VII.3.2. La concaténation....................................................................................................... 18
VII.4. Les fonctions en PHP ...................................................................................................... 19
VII.4.1. Fonctions mathématiques en PHP ............................................................................ 19
VII.4.2. Fonctions de date en PHP ......................................................................................... 20
VII.4.3. Fonctions sur les chaînes de caractères .................................................................... 23
VII.4.4. Autres fonctions pratiques en PHP ........................................................................... 24
VII.4.5. Fonctions personnalisées en PHP ............................................................................. 25
VII.5. Les structures conditionnelles ......................................................................................... 26
2 M. Marc TEJIOGNI | mtejiogni@[Link] | Tél : 693 90 91 21 – 682 66 37 31
Programmation Web II 2024 / 2025
Objectif du chapitre........................................................................................................................ 50
Objectifs spécifiques ...................................................................................................................... 50
I. Introduction à la POO ................................................................................................................. 50
I.1. Définitions ........................................................................................................................... 50
I.1.1. Les Objets ..................................................................................................................... 50
I.1.2. Les classes .................................................................................................................... 51
I.1.3. Les instances ................................................................................................................. 51
I.2. Exemple de création d’une classe ........................................................................................ 52
I.3. Le principe d'encapsulation ................................................................................................. 52
I.4. Exemple pratique : création d’une classe ............................................................................ 53
I.4.1. Syntaxe de base............................................................................................................. 53
I.4.2. Visibilité d'un attribut ou d'une méthode ...................................................................... 53
I.4.3. Création d'attributs ........................................................................................................ 54
I.4.4. Création des méthodes .................................................................................................. 54
II. Comment utiliser une classe en POO ? ..................................................................................... 55
II.1. Créer et manipuler un objet ................................................................................................ 56
II.1.1. Créer un objet .............................................................................................................. 56
II.1.2. Appeler les méthodes de l'objet ................................................................................... 56
II.1.3. Accéder à un élément depuis la classe ........................................................................ 57
II.1.4. Autres méthodes .......................................................................................................... 58
II.2. Les accesseurs et mutateurs ................................................................................................ 59
II.2.1. Accéder à un attribut : l'accesseur ............................................................................... 59
II.2.2. Modifier la valeur d'un attribut : les mutateurs ........................................................... 60
II.3. Le constructeur ................................................................................................................... 62
II.4. L'auto-chargement de classes ............................................................................................. 63
III. Les exceptions .......................................................................................................................... 66
III.1. Gestion des exceptions ...................................................................................................... 66
III.2. Des exceptions spécialisées .............................................................................................. 68
III.3. Convertir une erreur en exception ..................................................................................... 70
Tests de connaissances ................................................................................................................... 71
CHAPITRE IV : PHP ET MYSQL ................................................................................................... 72
Objectif du chapitre........................................................................................................................ 72
Objectifs spécifiques ...................................................................................................................... 72
I. Système de Gestion de Base de Données (SGBD) ..................................................................... 72
II. L’objet PDO (PHP Data Object) ............................................................................................... 73
III. Utilisation de l'objet PDO ........................................................................................................ 73
III.1. Chaîne de connexion (Instance PDO) ............................................................................... 74
III.2. Gestion d'erreurs éventuelles lors de l'instanciation d’un objet PDO ............................... 75
III.3. Préparation et exécution des requêtes (Requêtes préparées) ............................................ 77
III.4. Les requêtes de sélections ................................................................................................. 79
Tests de connaissances ................................................................................................................... 80
OBJECTIF GENERAL
Le cours de Programmation Web vise à donner à l’apprenant des outils et techniques lui permettant
de mettre sur pied un site web ou une application web complète.
OBJECTIFS SPECIFIQUES
Objectifs spécifiques
Connaître le principe de fonctionnement du PHP;
Mise en place du PHP dans une page Web
Quelques instructions usuelles en PHP
Maîtrisez les outils nécessaires à la mise en place d’un projet en PHP : WampServer, ….
Manipulation des variables et les constantes
Définition des opérations possibles sur les variables et constantes
Les structures conditionnelles et itératives
Les fonctions
Inventé par Rasmus Lerdorf, il trouvait le CGI (Common Gateway Interface) trop long, c'est
pour ça qu'il a développé PHP, il a publié la première version en 1993 et 1995 selon les sites.
Un des principaux intérêts de l'utilisation de CGI est la possibilité de fournir des pages dynamiques,
c'est-à-dire des pages personnalisées selon un choix ou une saisie de l'utilisateur. L'application la
plus fréquente de cette technique repose sur l'utilisation de formulaires HTML permettant à
l'utilisateur de choisir ou de saisir des données, puis de cliquer sur un bouton de soumission du
formulaire, envoyant alors les données du formulaire en paramètre du script CGI.
Un programme CGI peut être écrit dans à peu près n'importe quel langage de programmation
pourvu que celui-ci soit :
Capable de lire le flux de données d'entrée ;
Capable de traiter des chaînes de caractères ;
Capable d'écrire sur le flux standard de sortie ;
Exécutable ou interprétable par le serveur web.
Les langages de programmation les plus utilisés pour l'écriture des CGI sont les suivants :
Le langage Perl, particulièrement adapté à la manipulation de chaînes de caractères ;
Les langages C et C++ ;
Le langage Java.
Lorsqu'une requête est envoyée au serveur, celui-ci examine l'extension du fichier demandé afin de
déterminer l'action qu'il va effectuer. Ainsi, par exemple :
Dans le cas d'un fichier HTML (extension .htm ou .html) : le serveur va générer des en-
têtes de réponse HTTP qu'il va envoyer au navigateur demandant un fichier, puis envoyer le
fichier HTML.
Dans le cas d'un fichier CGI écrit en Perl (extension .pl) : le serveur va exécuter
l'interpréteur Perl, celui-ci va interpréter le code contenu dans le fichier portant l'extension
.pl, puis envoyer les données au serveur, qui va les envoyer au navigateur, comme dans le
cas d'un fichier HTML
Dans le cas d'un fichier CGI écrit en langage C (extension .exe sous Windows) : le
serveur va exécuter le CGI, puis envoyer vers le navigateur les données que le programme
lui aura transmis.
Ainsi, le rôle d'un script CGI est de recevoir des données envoyées par le serveur, de les traiter, puis
de renvoyer des en-têtes de réponses et des tags HTML valides. En effet, lorsqu'un programme CGI
renvoie un fichier, il doit commencer par envoyer un en-tête HTTP permettant de préciser le type de
contenu envoyé au navigateur (appelé type MIME), c'est-à-dire :
Dans le cas d'un fichier html, la chaîne suivante :
content-type : text/html
Dans le cas d'un fichier gif (pour faire de la création dynamique d'images par exemple,
comme dans le cas d'histogrammes ou de diagrammes divers), la chaîne suivante :
content-type : image/gif
Dans le cas d'un fichier quicktime, la chaîne suivante :
content-type : text/quicktime
Cela signifie que des machines clientes (machines faisant partie du réseau) contactent un serveur,
(une machine généralement très puissante en termes de capacités d'entrées-sorties) qui leur fournit
des services. Lesquels services sont exploités par des programmes, appelés programmes clients,
s'exécutant sur les machines clientes.
Exemple :
Pour afficher le rendu de la page dans un navigateur, il faudra consulter lien URL de page.
Exemple :
[Link]
Exemple :
« [Link] »
Pour indiquer que vous écrivez du code PHP, vous devez ajouter ces 2 balises :
<?php
?>
<?php
phpinfo();
?>
<?php
echo "Bonjour";
?>
Les commentaires
Les commentaires permettent de vous repérer dans votre code PHP, vous pouvez l'écrire
différemment selon le cas, regarder l'exemple ci-dessous :
<?php
// Commentaire sur 1 ligne
/*
Commentaires sur plusieurs lignes
*/
?>
Le caractère antislash (\) a de nombreuses utilisations. En premier lieu, s'il est suivi d'un caractère
non alphanumérique, il ne prendra pas la signification spéciale qui y est rattachée. Cette utilisation
de l'antislash comme caractère de protection s'applique à l'intérieur et à l'extérieur des classes de
caractères.
<?php
// Placer le caractére d'échappement devant le caracrtére guillemet
echo " Bonjour, \"<b>Jean</b>\", nous te souhaitons une bonne journee ";
// Autre exemple
echo "<img src=\"images/[Link]\" width=\"100\" height=\"40\" alt=\"Photo\" />";
?>
Séquence Effet
\t Insère une tabulation
\r Effectue un retour chariot
\n Effectue un retour à la ligne
Si vos séquences d'échappement ne fonctionnent pas, encadrez votre code des balises HTML <pre>
et </pre>.
Dés que la page PHP est générée, toutes les variables sont supprimées de la mémoire car elles ne
servent plus à rien.
Ce n'est donc pas un fichier qui reste stocké sur le disque dur mais une petite information
temporaire.
<?php
$Prenom="toto"; // La variable $Prenom a comme valeur "toto"
NB : Donner un nom évocateur à vos variables, les noms exotiques seront sources de perte de temps
si vous êtes amener à redévelopper ce script ultérieurement.
Chaînes de caractère
<?php>
// Type string, permet d'afficher un texte, ne pas oublier les '' ou ""
$Prenom="toto";
$Prenom='toto';
?>
Entiers
Un entier (integer, ou int) est un nombre de l'ensemble des entiers naturels {..., -2, -1, 0, 1, 2, ...}.
On peut l'exprimer de trois manières :
<?php
$a = 1234; // nombre entier en base décimale
$a = 02322; // le même en base octale, préfixé 0
$a = 0x4D2; // le même en base hexadécimale, préfixé 0x
$Valeur=123;
$Valeur1=1000/$Valeur;
$Valeur4=$Valeur+$Valeur1;
Incrémentation décrémentation
<?php
$a = $a+1 ; // identique à la ligne ci dessous
$a ++ ; // Permet d'incrémenter
$a -- ; // Permet de décrémenter
?>
Réels
Un nombre réel (float, ou double), appelé aussi "à virgule flottante", peut être exprimé de deux
manières :
<?php
$a = 1.234;
$a = 1.2e3; // Notation scientifique
?>
NB : En PHP, Il faut mettre un point et non une virgule pour les décimales.
Boolean
Permet d’exprimer si quelque chose est vrai (true en anglais), ou si c'est faux (false en anglais)
Affiche 1 pour true
N'affiche rien pour false
<?php
$Homme=true; // Boolean, TRUE
$Femme=false; // Boolean, TRUE
echo $Homme; // Affiche 1 "Vrai", la condition est respectée
echo $a;
?>
<?php
$var=10;
echo is_int($var); // Affiche 1, la variable $var est un entier
?>
<?php
$Prenom="toto"; // Variable string
$Valeur=123; // Variable integer
// Affiche le type de la variable
echo gettype($Prenom);
echo "<br />";
echo gettype($Valeur);
?>
Vous pouvez accéder à la valeur d'une constante en spécifiant simplement son nom. Contrairement
aux variables, vous ne devez PAS préfixer le nom de la constante avec $.
NB : Ne pas entourer de ' ' ou " " le nom de la constante, sinon elle s'affichera comme du texte.
__FILE__
<?php
echo __FILE__;
?>
__LINE__
<?php
echo "la ligne " . __LINE__ . " ne contient aucune erreur ;-)";
?>
PHP_VERSION
<?php
echo "la version de l'analyseur PHP est la : " . PHP_VERSION;
?>
PHP_OS
<?php
echo "le systéme d'exploitation du serveur est : " . PHP_OS;
?>
<?php
// Exemple avec HTML
echo "<h1>Bonjour</h1>";
echo "<p><strong>Toto écrit du code PHP</strong></p>";
// Exemple avec CSS
echo "<i class='fa fa-wrench'></i>";
?>
VII.3.2. La concaténation
Le terme concaténation (substantif féminin), du latin cum (« avec ») et catena (« chaîne, liaison »),
désigne l'action de mettre bout à bout au moins deux chaînes de caractères.
Exemple :
<?php
$nom = 'Dupont';
$prenom = 'Pierre';
echo $nom.$prenom; //va afficher "DupontPierre"
echo $nom.' '.$prenom; //va afficher "Dupont Pierre"
$nom = 'Dupont';
$nom .= ' '.$prenom;
echo $nom; //affichera "Dupont Pierre"
$a = 10;
$a.= 30; Le résultat serait 1030
$a=$a.$b; // La variable $a a la valeur de la concaténation de $a et $b
echo $a;
?>
<?php
$tauxeuro=6.5957;
echo "le taux de l'euro est " .$tauxeuro ;
?>
<?php
$tauxeuro=6.5957;
echo "le taux de l'euro arrondi est " .round($tauxeuro,2);
?>
<?php
$tauxeuro=6.5957;
echo "<b>le taux de l'euro arrondi est </b>" .round($tauxeuro,2);
?>
<?php
$tauxeuro=6.5957;
echo " <p class='alert alert-info'>le taux de l'euro arrondi est
".round($tauxeuro,2) ."</p>";
?>
round($variable, Nb_decimales);
<?php
echo date("d/m/Y"); // Affiche la date du jour
echo "Il est " . date("H:i:s") ; // Affiche l'heure
?>
Le timestamp PHP
Un timestamp, c'est un nombre. C'est le nombre de secondes écoulées depuis le 1er Janvier 1970 à
Minuit.
Pourquoi depuis le 1er Janvier 1970 à Minuit ? C'est symbolique, il fallait bien prendre un point
de départ. En fait, ça représente le début de l'époque où le systéme d'exploitation Unix a été créé.
Le 1er Janvier 1970 à Minuit, le timestamp avait pour valeur 0. Aujourd'hui, beaucoup beaucoup
de secondes se sont écoulées.
<?php
echo time(); //Affiche le nombre de secondes écoulées depuis le 1er janvier 1970
?>
Il est possible de fournir un second paramétre à date (aprés les lettres) : le timestamp sur lequel vous
voulez obtenir des informations.
Par défaut, date utilise le timestamp actuel : elle renvoie donc l'heure actuelle, le jour actuel etc...
Mais si vous lui donnez un timestamp, elle fera des calculs sur ce moment-là.
Allez, pour faire un test grandeur nature, je vous donne le timestamp qu'il était au moment où j'ai
écrit ces lignes.
<?php
$timestamp= 1544467069; // Timestamp affiché quand j'ai écris ce cours
echo date('d/m/Y-H:s:i',$timestamp);
?>
Enfin, une dernière chose qu'il peut être très utile de savoir faire : vous aimeriez connaître le
timestamp qu'il était le 5 Février 1998 à 13h 45min 26s.
Cette fonction peut prendre pas mal de paramètres, en voici la liste dans l'ordre :
Dans la pratique, vous pouvez oublier le dernier paramètre (heure d'hiver) qui ne vous sera pas utile
en général.
Sachez qu'il faut mettre 1 si l'heure d'hiver est activée, 0 si elle ne l'est pas.
Mais passons. Si on enlève l'heure d'hiver pour éviter de s'embrouiller, il reste 6 paramètres
possibles qu'on retiendra :
<?php
$vieux_timestamp = mktime(13, 45, 26, 2, 5, 1998);
echo 'Le timestamp du 05/02/1998 à 13h 45min 26s était : ' . $vieux_timestamp;
?>
getdate()
getdate retourne un tableau associatif contenant les informations de date et d'heure du timestamp
(lorsqu'il est fourni, sinon, le timestamp de la date/heure courante), avec les champs suivants :
print_r()
Permet d’afficher des informations à propos d'une variable, de manière à ce qu'elle soit lisible. Pour
une chaîne, un entier ou un double, la valeur elle même sera affichée.
Pour les tableaux, les valeurs seront présentées dans un format qui montre les clés et les valeurs.
Gardez en tête que print_r place le pointeur de tableau à la fin du tableau. Utilisez reset pour le
ramener au début.
<?php
$today = getdate();
print_r($today); //Array ( [seconds] => 25 [minutes] => 17 [hours] => 7 [mday] =>
10 [wday] => 1 [mon] => 12 [year] => 2018 [yday] => 343 [weekday] => Monday
[month] => December [0] => 1544426245 )
?>
strtotime()
Transforme un texte anglais en timestamp. Retourne un timestamp en cas de succès, FALSE sinon.
22 M. Marc TEJIOGNI | mtejiogni@[Link] | Tél : 693 90 91 21 – 682 66 37 31
Programmation Web II 2024 / 2025
<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>
date_diff()
<?php
$datetime1 = date_create('05-12-2018');
$datetime2 = date_create('10-12-2018');
$interval = date_diff($datetime1, $datetime2);
Bien sur ceci ne constitue pas l’ensemble des fonctions existantes sur les chaînes de caractères ou
tout autre objet. Pour avoir plus d’informations, bien vouloir consulter le lien suivant :
[Link]
Permet d’inclure du code PHP. La fonction include() est similaire à require(), à ceci prés qu'avec
include() le traitement ne s'interrompra pas en cas d'erreur, et le reste de la page s'affichera
normalement.
En cas d'erreur avec include() le script continuera de s'éxecuter, il n'émettra qu'une alerte de type
E_WARNING
<?php
include('[Link]'); // Cette page n'existe pas
?>
require()
require permet à la différence d'include de couper l'exécution du script PHP si le fichier à inclure
n'a pu être inclus.
<?php
/* Coupe l'exécution du script PHP si le fichier à inclure
n'a pu être inclus */
require('[Link]');
?>
NB : Par convention on met un « .inc » avant le « .php » pour indiquer que le fichier est à inclure.
require_once()
L'instruction require_once() est identique à require() mise à part que PHP vérifie si le fichier a
déjà été inclus et si c'est le cas, ne l'inclut pas une deuxième fois.
<?php
/* Vérifie si le fichier a déjà été inclus et si
c'est le cas, ne l'inclut pas une deuxiéme fois */
require_once('[Link]');
?>
mail()
<?php
$destinataire="toto@[Link]";
$sujet="Envoi de mail avec PHP";
$message = "Contenu de mon email";
$entete = "From: webmaster@[Link]";
mail($destinataire, $sujet, $message,$entete);
?>
Exemple :
<?php
function ConvDollar($prix) {
// Taux de change le 30 Décembre 2009 1.341
$calcul=$prix*1.341;
return $calcul;
}
// 10.54 est la valeur a calculé avec la fonction
echo ConvDollar(10.51);
?>
<?php
if(condition) {
// instruction1;
}
else{
// instruction2;
}
?>
<?php
if(condition1) {
// instruction1;
}
elseif (condition2){
// instruction2;
}
else {
// instruction3;
}
?>
VII.5.3. switch
switch($variable){
case "condition1":
// instruction;
break;
case "condition2":
// instruction;
break;
case "condition3":
// instruction;
break;
default:
// instruction;
break;
}
La fonction isset() verifie si une variable est bien définie, ce n'est que dans ce cas qu'elle renvoie la
valeur vrai (true), dans le cas inverse, le résultat du test est false.
Exemple :
<?php
$var="toto";
if(isset($var) && $var=="toto"){
echo "C'est bien toto<br>";
}
else{
echo "Ce n'est pas toto";
}
?>
empty()
La fonction empty() détermine si une variable est vide ou non. Elle retourne TRUE si la chaîne
passée en argument est vide.
Exemple :
<?php
$prenom="Paul";
if(empty($prenom)){
echo "La variable est vide";
}
else{
echo "La variable n'est pas vide, elle est de type "
.gettype($prenom);
}
?>
<?php
for(initialisation; condition de continuité; incrémentation) {
// Bloc d'instructions;
}
?>
Exemple :
<?php
for($i=0; $i<10; $i++){
echo $i;
}
?>
C'est pour cela que, quel que soit le type de boucle (While ou For), il faut indiquer une condition.
Tant que la condition est remplie, les instructions sont réexécutées. Dés que la condition n'est plus
remplie, on sort de la boucle
<?php
while(condition) {
// Bloc d'instruction
}
?>
Exemple :
<?php
$j=1;
while($j<7){
echo $j++ ." ";
}
?>
Si l'on reprend l'exemple avec la boucle while, nous constaterons que si on initialise $i à 8, la
boucle ne sera jamais exécutée, car dés l'analyse de la condition, 8 < 7 renverra FALSE (8 est bien
supérieur à 7).
La boucle do while permet d'effectuer au moins une fois une opération, et si une condition est vraie,
reboucler autant de fois que vous le souhaitez.
Dans le cas de la boucle while, la condition est examinée avant la boucle tandis que pour la boucle
do while elle est éxaminée à la fin.
Donc même si cette condition n'est pas vérifiée, la boucle s'exécutera une fois.
<?php
do {
// instruction 1;
// instruction 2;
} while(condition);
?>
Exemple :
<?php
$i=8;
$j=7;
do {
echo 'la boucle a bouclé une fois, même si la condition n\'a pas été
respectée,<br />
la variable $i < n\'est pas inférieur à $j';
} while ($i < $j);
?>
Tests de connaissances
1. Définir : PHP, Script CGI
2. Quel est le rôle du PHP en Programmation Web ?
3. Comment mettre en place un script PHP dans une page Web ?
4. Pourquoi dit-t-on que PHP est un langage côté serveur ?
5. Pourquoi dit-t-on PHP est basé sur le principe client / serveur ?
6. Citer quelques serveurs Web que vous connaissez ?
7. Quelle différence faites-vous les fonctions « print_r » et « var_dump » en PHP ?
Objectifs spécifiques
Définition et manipulation des tableaux
Utilisation des variables superglobales
Gestion des fichiers
I. Les tableaux
Il s'agit de variables qui peuvent contenir plusieurs valeurs. On peut donc imaginer leur
représentation sous forme d'un tableau.
Pour différencier les valeurs, pour savoir comment on va dire à PHP "je veux telle valeur de cette
variable" il faut bien distinguer les valeurs par des indices.
Indice Valeur
0 Maurice
1 Jean
2 Marc
3 William
4 Romeo
$Prenom[0]='Maurice';
$Prenom[1]='Jean';
$Prenom[2]='Pierre';
$Prenom[3]='Paul';
$Prenom[4]='Gérard';
echo $Prenom[4];
// Syntaxe equivalente
$Prenom=array(0=>'Maurice',
1=>'Jean',
2=>'Pierre',
3=>'Paul',
4=>'Gérard');
echo $Prenom[4];
/* Dans le cas où vous souhaitez garder le premier indice à zéro (et les suivants
incrémentés de 1 à chaque fois) vous pouvez également utiliser la syntaxe suivante
*/
$Prenom=array('Maurice','Jean','Pierre','Paul','Gérard');
echo $Prenom[4];
?>
La fonction « count »
<?php
echo count($Prenom) ." prénoms dans le tableau";
?>
NB : La fonction « sizeof », au mettre titre que la fonction « count » permet de compter le nombre
d’éléments d’un tableau
<?php
// 1ère syntaxe
$Article=array();
$Article['Numero']=77;
$Article['Nom']="Cable rond";
$Article['Prix']=7;
echo "Ref: ".$Article['Numero'] ." Article: " .$Article['Nom'] ." Prix: "
.$Article['Prix'];
// Seconde syntaxe
$Articles=array('Numero' =>77,
'Nom' => "Cable rond",
'Prix' => 7);
echo "Ref: ".$Articles['Numero'] ." Article: " .$Articles['Nom'] ." Prix:
" .$Articles['Prix'];
?>
<?php
// 1ère ligne
$tab1=array();
$tab1[0][0]="France";
$tab1[0][1]="Paris";
$tab1[0][2]=80;
// 2ème ligne
$tab1[1][0]="Japon";
$tab1[1][1]="Tokyo";
$tab1[1][2]=90;
// 3ème ligne
$tab1[2][0]="UK";
$tab1[2][1]="Londres";
$tab1[2][2]=70;
echo $tab1[1][2];
?>
<?php
$array = array( 1, 2, 3, 5, 8, 12 );
foreach( $array as $value ){
echo $value . '<br >';
}
?>
Ainsi, nous parcourons le tableau $array et la valeur de l'élément courant est copié dans $value, qui
est ensuite affiché.
Contrairement au tableau précédant, les indices des éléments ne sont pas des nombres (0, 1, 2, ...)
mais des chaînes de caractères (on appelle un tel tableau un tableau associatif). Ainsi, si je veux
accéder au deuxième élément, je dois procéder comme suit: $array['deuxieme'] .
Il est donc impossible ici d'utiliser for, par contre, avec foreach, aucun problème.
<?php
$array = array( 'premier' => 'N° 1', 'deuxieme' => 'N° 2', 'troisieme' => 'N° 3');
// on parcourt $array, la valeur de l'item courant est copiée dans $value
foreach($array as $value) {
echo $value . '<br>';
}
?>
foreach permet également de connaître, en plus de la valeur de l'élément courant, sa clé. Dans ce
cas, on parcourt le tableau $array et la clé de l'élément courant est copiée dans $key tandis que sa
valeur est copiée dans $value.
<?php
$array = array( 'premier' => 'N° 1', 'deuxieme' => 'N° 2', 'troisieme' => 'N° 3');
sort permet de trier un tableau dans l’ordre croissant. Elle ne s’applique qu’au tableau numérique.
rsort
rsort permet de trier un tableau dans l’ordre déroissant. Elle ne s’applique qu’au tableau numérique.
ksort
ksort permet de trier un tableau par ordre croissant suivant les clés. Elle ne s’applique qu’au tableau
associatif.
krsort
krsort trie un tableau par ordre décroissant suivant les clés. Elle ne s’applique qu’au tableau
associatif.
Ces variables sont automatiquement créées par PHP à chaque fois qu'une page est chargée. Ces
variables existent donc sur toutes les pages et sont accessibles partout : au milieu de votre code, au
début, dans les fonctions etc...
Exemple
[Link]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>GET</title>
</head>
<body>
<a href="[Link]?prenom=Marc">
Envoyer des données via une url
</a>
</body>
</html>
[Link]
<?php
echo $_GET['prenom'];
?>
[Link]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>GET</title>
</head>
<body>
<a href="[Link]?prenom=Marc&nom=TEJIOGNI&annee=2018">
Envoyer des données via une url
</a>
</body>
</html>
NB : Dans le code HTML, il n’est pas conseillé d’écrire directement le symbole « & », Il faut le
remplacer par son code HTML : « & »
[Link]
<?php
echo $_GET['prenom'];
echo $_GET['nom'];
echo $_GET['annee'];
?>
Exemple
Dans cette page, nous ajouterons un formulaire constitué d’un champ de texte nommé "nom" ainsi
qu'un bouton d'envoi.
Dans la balise form, action doit pointer vers une page en PHP (Exemple: [Link]") qui va
traiter l'information.
[Link]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>POST</title>
</head>
<body>
<form name="formulaire" method="post" action="[Link]">
<input type="text" name="nom" />
<input type="submit" name="envoyer" value="Envoyer" />
</form>
</body>
</html>
[Link]
<?php
echo $_POST['nom'];
?>
<?php
echo $_SERVER['SERVER_NAME'];
?>
<?php
echo $_SERVER['DOCUMENT_ROOT'];
?>
<?php
echo $_SERVER['PHP_SELF'];
?>
<?php
echo $_SERVER['REMOTE_ADDR'];
?>
<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>
<?php
echo $_SERVER['HTTP_REFERER'];
?>
<?php
var_dump($_SERVER);
?>
Chaque utilisateur ayant besoin des sessions se voit attribuer un identifiant unique appelé ID de
session. Cet identifiant est stocké sur le poste de l'internaute sous forme d'un cookie ou URL si
l'option session.use_trans_sid est à 1 (ou On) dans le fichier [Link].
Utiliser la méthode du cookie est plus que recommandée : un identifiant de session dans l'URL
empêche de retenir l'adresse d'une page simplement par le visiteur néophyte, cela rallonge donc
l'adresse de votre page. Cela nuit également au référencement de votre page. En effet, l'identifiant
étant unique, lorsque le robot du moteur de recherche scanne votre site, il ne retombera jamais sur la
même URL plusieurs fois de suite.
Avant d'utiliser les sessions sur une page, on doit toujours utiliser la fonction session_start() placée
avant tout envoi de code HTML, et donc généralement tout en haut de votre page PHP.
session_start();
$_SESSION['nom']="Valeur";
Pourquoi session_start() doit-elle être placée de la sorte ? Et bien parce que si PHP utilise les
cookies pour repérer quel est l'id de session utilisé par l'internaute, il va écrire cet id de session dans
un cookie. Or, le protocole HTTP fonctionne de telle sorte que les en-têtes (qui permettent de dire à
votre navigateur "crée un cookie ayant tel nom et telle valeur") sont envoyés avant le premier
caractère HTML transmis.
Cela veut dire que dés que vous transmettrez un caractère HTML, les en-têtes seront envoyés et
vous ne pourrez plus les modifier, vous ne pourrez donc plus écrire le cookie de session.
En général, si vous faites une maladresse de ce style, vous vous retrouverez avec une erreur de
« headers already sent ».
Sauf si on configure le fichier [Link] avec [Link] qui fixe la durée de vie, en secondes,
du cookie envoyé au client. La valeur 0 signifie "jusqu'à ce que le client soit fermé". Par défaut il
est à 0.
Donc si on le laisse à zéro la session dure jusqu'à la fermeture du navigateur, pour laisser les
données durant 30 minutes, il faut remplacer 0 par 1800 (car 1800 = 30 minutes * 60 secondes).
echo session_id();
Autre méthode si vous utilisez le tableau superglobale $_SESSION, il suffit alors d'utiliser unset().
unset($_SESSION["mavariable"])
Il est aussi possible de purger (supprimer) toutes les variables de la session avec :
session_unset();
session_write_close();
session_ destroy();
Exemple
<?php
// On démarre la session AVANT toute chose,
session_start();
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Variables de session</title>
</head>
<body>
<p>
Bonjour <?php echo $_SESSION['prenom']; ?>
</p>
Exemple : Vous stockez le pseudo du visiteur. Lorsqu'il revient sur votre site, vous pouvez lire dans
le cookie et lui afficher « Bonjour votre_pseudo ».
Contrairement à certaines légendes, les cookies sont totalement inoffensifs, ce ne sont pas des virus
ou troyens ou je ne sais quoi !
La fonction PHP qui permet d'écrire un cookie est setcookie qui signifie Placer un cookie en
français.
setcookie (string nom, string valeur, string expiration, string chemin, string
domaine, string securise);
NB : Comme pour session_start que nous avons vu précédemment, setcookie doit être placé avant
votre code HTML. Placer le avant la balise <!DOCTYPE>.
Afficher un cookie
$_COOKIE['Nom_cookie'];
PHP va lire l'information stockée dans le cookie du visiteur. Ces informations sont placées dans la
superglobale $_COOKIE, sous forme d'array (tableau).
Pour modifier la valeur d'un cookie, il faut faire appel à setcookie en conservant le même nom de
cookie et en modifiant simplement sa valeur.
Suprimer un cookie
setcookie("Nom_cookie");
Exemple :
<?php
$timestamp = time() + 365*24*3600; // Le cookie a une durée de vie de 1an
setcookie('nom', 'TEJIOGNI', $timestamp); // On écrit un cookie
setcookie('prenom', 'Marc', $timestamp); // On en écrit un autre
// Vous remarquez que tout est bien noté avant le début du code HTML
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Les Cookies</title>
</head>
<body>
<p>
Bonjour <?php echo $_COOKIE['prenom']; ?>
<?php echo $_COOKIE['nom']; ?>
</p>
</body>
</html>
La fonction fopen() permet d’ouvrir un fichier. Elle renvoie true si l'ouverture est possible et false si
elle ne l'est pas.
Exemple
<?php
$source= "[Link]";
if($fichier=@fopen($source,"r")) {
echo "L'ouverture du fichier est possible car la fonction
fopen retourne TRUE<br />";
}
else {
echo "Ouverture du fichier impossible car fopen retourne
FALSE";
}
?>
Après tout traitement effectué sur un fichier, on doit le fermer avec la fonction fclose().
fclose(string filename);
Exemple
<?php
$source= "[Link]";
if($fichier=@fopen($source,"r")) {
echo "L'ouverture du fichier est possible car la fonction
fopen retourne TRUE<br />";
fclose($fichier);
}
else {
echo "Ouverture du fichier impossible car fopen retourne
FALSE";
}
?>
fpassthru(string pointeur);
Exemple
<?php
$source= "[Link]";
$fichier=fopen($source,"r");
fpassthru($fichier);
fclose($fichier);
?>
La fonction fgets() permet d'extraire une chaîne d'une certaine longueur d’un fichier.
Il faut aussi savoir que la fonction extrait la chaîne de la longueur précise définie en argument, plus
un caractère et que la fonction s'arrête aux sauts de lignes
Exemple
< ?php
$source= "[Link]";
$fichier= fopen($source,"r+");
echo fgets($fichier,4);
fclose($fichier);
?>
Il est possible d’utiliser également la fonction fgetss() (même syntaxe que fgets) pour extraire une
chaîne d’une certaine longueur d’un fichier. La fonction fgetss() a quasiment la même utilité que la
fonction fgets() sauf qu'elle n'extrait ni les balises HTML, ni les balises PHP.
Exemple
Pour un fichier contenant : '<strong>Bonjour !< /strong>< br>Test de la fonction fgetss', la fonction
ne renverra que les caractères, la mise en forme HTML sera ignorée : 'Bonjour !Test de la fonction
fgetss'.
fgetc
fgetc(string pointeur);
Exemple
< ?php
$source= "[Link]";
$fichier = fopen($source,"r");
$premier = fgetc($fichier);
echo "Premier Caractére : " . $premier;
fclose($fichier);
?>
fread
La fonction fread() permet de lire une chaîne de caractère dans un fichier ouvert, jusqu'a la
longueur indiquée en argument.
Exemple
<?php
$source= "[Link]";
$fichier = fopen($source,"r");
$premier = fread($fichier, 10);
echo "Dix Premiers Caractéres : " . $premier;
fclose($fichier);
?>
Elle retourne une valeur de type int qui correspond au nombre d’octets écrits ou FALSE en cas
d'erreur. Le troisième paramètre qui est facultatif est la longueur. Lorsqu'il est spécifié, il indique le
nombre maximal d'octets à écrire.
Exemple
<?php
$source= "[Link]";
$fichier = fopen($source, "a");
file_exists(string filename);
Exemple
<?php
if(file_exists("[Link]")) {
echo "Fichier existant";
}
else {
echo "Introuvable !";
}
?>
Exemple
<?php
$source= "[Link]";
if(@copy($source, "../copy_fichier.txt")) {
echo "Le fichier " . $source . " a été copié ";
echo "dans le répertoire ../copy_fichier.txt.";
}
else {
echo "Erreur";
}
?>
Le fichier a été ainsi copié dans le répertoire père du répertoire courant où se trouve le fichier.
Exemple
<?php
$source= "[Link]";
if(@rename($source,"nouveau_fichier.txt")) {
echo "Le fichier " . $source . "a été renommé ";
echo "en nouveau_fichier.txt.";
}
else {
echo "Erreur";
}
?>
unlink(string filename);
Exemple
<?php
$source= "[Link]";
if(@unlink($source)) {
echo "Le fichier a bien été supprimé.";
}
else {
echo "Erreur";
}
?>
Tests de connaissances
1. Quelle différence faites-vous entre un tableau numérique et un tableau associatif en PHP ?
Donner un exemple pour chacun.
2. Quelle différence faites-vous entre « $_POST » et « $_GET » ?
3. Quelle différence faites-vous entre une session et un cookie en PHP ?
4. Selon vous quel est l’intérêt d’utiliser un fichier pour stocker les données ?
Objectifs spécifiques
Définir les notions telles que : classe, objet, instance, encapsulation, héritage et
polymorphisme ;
Appréhender les notions d’auto-chargement de classes, et d’exceptions.
I. Introduction à la POO
Nous commencerons ce chapitre en vous posant une question : comment est représenté votre code ?
La réponse est unique : vous avez utilisé la « représentation procédurale » qui consiste à séparer le
traitement des données des données elles-mêmes. Par exemple, vous avez un système de news sur
votre site. D'un côté, vous avez les données (les news, une liste d'erreurs, une connexion à la BDD,
etc.) et de l'autre côté vous avez une suite d'instructions qui viennent modifier ces données. Si je ne
me trompe pas, c'est de cette manière que vous codez.
Eh bien, il existe une autre manière de coder : la Programmation Orienté Objet (POO). La POO,
c'est tout simplement faire de son site un ensemble d'objets qui interagissent entre eux. En d'autres
termes : tout est objet.
I.1. Définitions
I.1.1. Les Objets
Vous en avez pas mal à côté de vous : je suis sûr que vous avez un ordinateur, une lampe, une
chaise, un bureau, ou que sais-je encore. Ce sont tous des objets. En programmation, les objets sont
sensiblement la même chose.
L'exemple le plus pertinent quand on fait un cours sur la POO est d'utiliser l'exemple du personnage
dans un jeu de combat. Ainsi, imaginons que nous ayons un objet « Personnage » dans notre
application. Un personnage a des caractéristiques :
50 M. Marc TEJIOGNI | mtejiogni@[Link] | Tél : 693 90 91 21 – 682 66 37 31
Programmation Web II 2024 / 2025
Une force ;
Une localisation ;
Une certaine expérience ;
Et enfin des dégâts.
Toutes ses caractéristiques correspondent à des valeurs. Comme vous le savez sûrement, les valeurs
sont stockées dans des variables. C'est toujours le cas en POO. Ce sont des variables un peu
spéciales, mais nous y reviendrons plus tard.
Une classe est une entité regroupant des variables et des fonctions. Chacune de ces fonctions aura
accès aux variables de cette entité. Dans le cas du personnage, nous aurons une fonction
« frapper() ». Cette fonction devra simplement modifier la variable « $degats » du personnage en
fonction de la variable « $force ». Une classe est donc un regroupement logique de variables et
fonctions que tout objet issu de cette classe possédera.
Vous voyez donc les variables et fonctions stockées dans la classe « Personnage ». Sachez qu'en
réalité, on ne les appelle pas comme ça : il s'agit d'attributs (ou propriétés) et de méthodes. Un
attribut désigne une variable et une méthode désigne une fonction.
Ainsi, tout objet « Personnage » aura ces attributs et méthodes. On pourra modifier ces attributs et
invoquer ces méthodes sur notre objet afin de modifier ses caractéristiques ou son comportement.
Prenons l'exemple d'un avion où sont disponibles des centaines de boutons. Chacun de ces boutons
constituent des actions que l'on peut effectuer sur l'avion. C'est l'interface de l'avion. Le pilote se
moque de quoi est composé l'avion : son rôle est de le piloter. Pour cela, il va se servir des boutons
afin de manipuler les composants de l'avion. Le pilote ne doit pas se charger de modifier
manuellement ces composants : il pourrait faire de grosses bêtises.
Le principe est exactement le même pour la POO : l'utilisateur de la classe doit se contenter
d'invoquer les méthodes en ignorant les attributs. Comme le pilote de l'avion, il n'a pas à les
trifouiller. Pour instaurer une telle contrainte, on dit que les attributs sont privés. Pour l'instant, ceci
peut sans doute vous paraître abstrait, mais nous y reviendrons.
Cette syntaxe est à retenir. Ce qu'on vient de faire est donc de créer le moule, le plan qui définira
nos objets.
La déclaration d'attributs dans une classe se fait en écrivant le nom de l'attribut à créer, précédé de
sa visibilité.
Le premier, public, est le plus simple. Si un attribut ou une méthode est public, alors on pourra y
avoir accès depuis n'importe où, depuis l'intérieur de l'objet (dans les méthodes qu'on a créées),
comme depuis l'extérieur. Quand on crée un objet, c'est principalement pour pouvoir exploiter ses
attributs et méthodes. L'extérieur de l'objet, c'est tout le code qui n'est pas dans votre classe. En
effet, quand vous créerez un objet, cet objet sera représenté par une variable, et c'est à partir d'elle
qu'on pourra modifier l'objet, appeler des méthodes, etc. Vous allez donc dire à PHP « dans cet
objet, donne-moi cet attribut » ou « dans cet objet, appelle cette méthode » : c'est ça, appeler des
attributs ou méthodes depuis l'extérieur de l'objet.
Le second, private, impose quelques restrictions. On n'aura accès aux attributs et méthodes
seulement depuis l'intérieur de la classe, c'est-à-dire que seul le code voulant accéder à un attribut
privé ou une méthode privée écrit(e) à l'intérieur de la classe fonctionnera. Sinon, une jolie erreur
fatale s'affichera disant que vous ne pouvez pas accéder à telle méthode ou tel attribut parce qu'il ou
elle est privé(e).
<?php
class Personnage {
private $_force; // La force du personnage
private $_localisation; // Sa localisation
private $_experience; // Son expérience
private $_degats; // Ses dégâts
}
?>
Vous pouvez constater que chaque attribut est précédé d'un underscore (« _ »). Ceci est une notation
qu'il est préférable de respecter (il s'agit de la notation PEAR) qui dit que chaque nom d'élément
privé doit être précédé d'un underscore.
<?php
class Personnage {
private $_force = 50; // La force du personnage, par défaut à 50.
private $_localisation = 'Lyon'; // Sa localisation, par défaut à Lyon.
private $_experience = 1; // Son expérience, par défaut à 1.
private $_degats = 0; // Ses dégâts, par défaut à 0.
}
?>
NB : La valeur par défaut que vous donnez à vos variables doit être une expression scalaire statique.
Par conséquent, leur valeur ne peut par exemple pas être issue d'un appel à une fonction (private
$_attribut = strlen('azerty')) ou d'une variable, superglobale ou non (private $_attribut =
$_SERVER['REQUEST_URI']). Si votre version de PHP est antérieure à la 5.6, vous ne pouvez
spécifier que des valeurs statiques, ce qui rend impossible l'assignation du résultat d'une opération.
Par exemple, vous ne pouvez pas faire de private $_attribut = 1 + 1 ou bien private $_attribut =
'Hello ' . 'world !'
moins que vous teniez absolument à ce que l'utilisateur ne puisse pas appeler cette méthode, par
exemple s'il s'agit d'une fonction qui simplifie certaines tâches sur l'objet mais qui ne doit pas être
appelée n'importe comment).
<?php
class Personnage
{
private $_force; // La force du personnage
private $_localisation; // Sa localisation
private $_experience; // Son expérience
private $_degats; // Ses dégâts
}
}
?>
De même que l'underscore précédant les noms d'éléments privés, vous pouvez remarquer que le
nom des classes commence par une majuscule. Il s'agit aussi du respect de la notation PEAR.
<?php
$perso = new Personnage;
?>
Ainsi, « $perso » sera un objet de type « Personnage ». On dit que l'on instancie la classe
Personnage ou que l'on crée une instance de la classe Personnage.
<?php
/* Nous créons une classe « Personnage ». */
class Personnage {
private $_force;
private $_localisation;
private $_experience;
private $_degats;
Lorsque vous avez un objet, vous savez que vous pouvez invoquer des méthodes grâce à l'opérateur
« -> ». Nous avons par ailleurs dit que c'était également grâce à cet opérateur qu'on accédait aux
attributs de la classe. Cependant, rappelez-vous : nos attributs sont privés. Par conséquent, le code
ci-dessous lèvera une erreur fatale.
<?php
class Personnage {
private $_force;
private $_experience;
private $_degats;
}
Ici, on essaye d'accéder à un attribut privé hors de la classe. Ceci est interdit, donc PHP lève une
erreur. Dans notre exemple (qui essaye en vain d'augmenter de 1 l'expérience du personnage), il
faudra demander à la classe d'augmenter l'expérience. Pour cela, nous allons écrire une méthode
« gagnerExperience() », nous allons y ajouter également la méthode « afficherExperience() »
pour afficher l’expérience.
<?php
class Personnage {
private $_experience = 50;
<?php
class Personnage {
private $_degats = 0; /* Les dégâts du personnage. */
private $_experience = 0; /* L'expérience du personnage. */
private $_force = 20; /* La force du personnage (plus elle est grande,
plus l'attaque est puissante). */
On désire implémenté une méthode « frapper() », qui devra infliger des dégâts à un personnage.
Cette méthode doit accepter un argument : le personnage à frapper. La méthode aura juste pour rôle
d'augmenter les dégâts du personnage à frapper passé en paramètre en fonction de la force du
personnage qui frappe c'est-à-dire ajouter aux dégâts du personnage à frapper, la force du
personnage qui frappe.
Ainsi on aura :
<?php
class Personnage {
private $_degats; /* Les dégâts du personnage. */
private $_experience; /* L'expérience du personnage. */
private $_force; /* La force du personnage (plus elle est grande, plus
l'attaque est puissante). */
?>
Cette expression « Personnage $persoAFrapper » permet de s’assurer qui s’agit bel et bien d’un
personnage passé en paramètre à la fonction « frapper »
Puisque, à la base, les deux personnages ont le même niveau de dégâts, la même expérience et la
même force, ils seront à la fin toujours égaux. Pour pallier ce problème, il faudrait pouvoir assigner
des valeurs spécifiques aux deux personnages, afin que le combat puisse les différencier. Or, vous
ne pouvez pas accéder aux attributs en-dehors de la classe ! Pour savoir comment résoudre ce
problème, nous allons apprendre deux nouveaux mots : accesseur et mutateur.
<?php
class Personnage {
private $_force;
private $_experience;
private $_degats;
La classe doit impérativement contrôler la valeur afin d'assurer son intégrité car, si elle ne le fait
pas, on pourra passer n'importe quelle valeur à la classe et le principe d'encapsulation n'est plus
respecté ! Ces méthodes ont aussi un nom spécial : il s'agit de mutateurs (ou setters). Par exemple,
voici la liste des mutateurs de notre classe Personnage :
<?php
class Personnage {
private $_force;
private $_experience;
private $_degats;
$this->_experience = $experience;
}
Maintenant que nous avons vu ce qu'étaient des accesseurs et des mutateurs, nous pouvons écrire un
petit script de combat à travers la classe Personnage de la manière suivante :
<?php
$perso1->setForce(10);
$perso1->setExperience(2);
$perso2->setForce(90);
$perso2->setExperience(58);
?>
II.3. Le constructeur
Imaginez un objet pour lequel vous avez besoin d'initialiser les attributs dès sa création, sans
connaitre leurs valeurs à l'avance. Par exemple, vous souhaiteriez pouvoir spécifier la force et les
dégâts d'un personnage dès sa création. Actuellement, la seule possibilité qui s'offre à vous est de
modifier ces attributs manuellement, une fois l'objet créé. Il existe en PHP une méthode, appelée le
constructeur, qui remplira ce rôle. Ce constructeur n'est autre qu'une méthode écrite dans votre
classe.
Effectuons un retour sur notre classe Personnage. Ajoutons-lui un constructeur. Ce dernier ne peut
pas avoir n'importe quel nom (sinon, comment PHP sait quel est le constructeur ?). Il a tout
simplement le nom suivant :__construct, avec deux underscores au début.
Comme son nom l'indique, le constructeur sert à construire l'objet. Ce que nous voulons dire par là,
c'est que si des attributs doivent être initialisés ou qu'une connexion à la BDD doit être faite, c'est
par ici que ça se passe. Comme dit plus haut, le constructeur est exécuté dès la création de l'objet et
par conséquent, aucune valeur ne doit être retournée, même si ça ne génèrera aucune erreur. Bien
sûr, et comme nous l'avons vu, une classe fonctionne très bien sans constructeur, il n'est en rien
obligatoire ! Si vous n'en spécifiez pas, cela revient au même que si vous en aviez écrit un vide
(sans instruction à l'intérieur).
<?php
class Personnage {
private $_force;
private $_localisation;
private $_experience;
private $_degats;
Notez que nous n’avons pas réécrit toutes les méthodes, ce n'est pas le but de ce que nous voulons
vous montrer ici.
Ici, le constructeur demande la force et les dégâts initiaux du personnage que l'on vient de créer. Il
faudra donc lui spécifier ceci en paramètre :
<?php
Notez quelque chose d'important dans la classe : dans le constructeur, les variables (attributs) sont
initialisées en appelant les mutateurs correspondant. En effet, si on assignait directement à ces
variables des valeurs, le principe d'encapsulation ne serait plus respecté et n'importe quel type de
valeur pourrait être assigné !
Attention : Ne mettez jamais la méthode __construct avec le type de visibilité private car elle ne
pourra jamais être appelée, vous ne pourrez donc pas instancier votre classe ! Cependant, sachez
qu'il existe certains cas particuliers qui nécessitent le constructeur en privé, mais ce n'est pas pour
tout de suite.
<?php
// On inclut la classe.
require '[Link]';
Maintenant, imaginons que vous ayez plusieurs dizaines de classes… Pas très pratique de les
inclure une par une ! Vous vous retrouverez avec des dizaines d'inclusions, certaines pouvant même
être inutile si vous ne vous servez pas de toutes vos classes. Et c'est là qu'intervient l'auto-
chargement des classes. Vous pouvez créer dans votre fichier principal (c'est-à-dire celui où vous
créerez une instance de votre classe) une ou plusieurs fonction(s) qui tenteront de charger le fichier
déclarant la classe. Dans la plupart des cas, une seule fonction suffit. Ces fonctions doivent accepter
un paramètre, c'est le nom de la classe qu'on doit tenter de charger. Par exemple, voici une fonction
qui aura pour rôle de charger les classes :
<?php
function chargerClasse($classe) {
/* On inclut la classe correspondante au paramètre passé. */
require $classe . '.php';
}
?>
Si nous essayons maintenant de créer un objet pour voir si il sera chargé automatiquement (nous
prenons pour exemple la classe Personnage et prenons en compte le fait qu'un fichier
[Link] existe), nous aurons une jolie erreur du genre : « erreur fatale, la classe n’a pas été
trouvée ». Ce qui est normal quand on y réfléchi.
PHP ne sait pas qu'il doit appeler cette fonction lorsqu'on essaye d'instancier une classe non
déclarée. Ainsi, pour palier à ce problème, on va donc utiliser la fonction « spl_autoload_register »
en spécifiant en premier paramètre le nom de la fonction à charger :
<?php
function chargerClasse($classe) {
/* On inclut la classe correspondante au paramètre passé. */
require $classe . '.php';
}
Décortiquons ce qui s'est passé. En PHP, il y a ce qu'on appelle une « pile d'autoloads ». Cette pile
contient une liste de fonctions. Chacune d'entre elles sera appelée automatiquement par PHP
lorsque l'on essaye d'instancier une classe non déclarée. Nous avons donc ici ajouté notre fonction à
la pile d'autoloads afin qu'elle soit appelée à chaque fois qu'on essaye d'instancier une classe non
déclarée.
NB : Sachez que vous pouvez enregistrer autant de fonctions en autoload que vous le voulez avec
spl_autoload_register. Si vous en enregistrez plusieurs, elles seront appelées dans l'ordre de leur
enregistrement jusqu'à ce que la classe soit chargée. Pour y parvenir, il suffit d'appeler
spl_autoload_register pour chaque fonction à enregistrer.
Attention : Pour que l’auto-chargement des classes fonctionne, il faut que le nom de la classe et le
fichier .php qui contient la classe porte exactement le même nom et que chaque classe corresponde
à un et un seul fichier .php.
Pour synthétiser, une erreur est le résultat d’un fonctionnement anormal alors qu'une exception est
un fonctionnement normal, mais exceptionnel.
Une exception peut être lancée depuis n'importe où dans le code. Quand on lance une exception, on
doit, en gros, lancer une instance de la classe « Exception ». Cet objet lancé contiendra le message
d'erreur.
<?php
function additionner($a, $b) {
if (!is_numeric($a) || !is_numeric($b)) {
// On lance une nouvelle exception grâce à throw et on instancie directement un
objet de la classe Exception.
throw new Exception('Les deux paramètres doivent être des nombres');
}
return $a + $b;
}
Attention : Ne lancez jamais d'exception dans un destructeur. Si vous faites une telle chose, vous
aurez une erreur fatale : Exception thrown without a stack frame in Unknown on line 0.
Afin d'attraper une exception, il faut d'abord qu'elle soit lancée. Le problème, c'est qu'on ne peut pas
dire à PHP que toutes les exceptions lancées doivent être attrapées : c'est à nous de lui dire que l'on
va essayer d'effectuer telle ou telle instruction et, si une exception est lancée, alors on attrapera
celle-ci afin qu'aucune erreur fatale ne soit lancée et que de tels messages ne s'affichent plus.
try {
// Instructions
}catch(<type exception>){
// Instructions
Où <type exception> correspond au type d’exception à attraper. Une fois le type d’exception
attrapé il faut afficher le message d'erreur. Pour ce faire, il faut appeler la méthode
« getMessage() ». Si vous souhaitez récupérer le code d'erreur, il faut appeler « getCode() ».
<?php
function additionner($a, $b){
if (!is_numeric($a) || !is_numeric($b)) {
/* On lance une nouvelle exception si l'un des deux paramètres n'est pas un
nombre. */
throw new Exception('Les deux paramètres doivent être des nombres');
}
return $a + $b;
}
Avant de ce lancer dans ce genre de pratique, encore faut-il savoir quelles méthodes et attributs
seront disponibles dans la classe Exception. Voici la liste des attributs et méthodes de la classe
Exception tirée de la documentation :
<?php
class Exception {
protected $message = 'exception inconnu'; // Message de l'exception.
protected $code = 0; // Code de l'exception défini par l'utilisateur.
protected $file; // Nom du fichier source de l'exception.
protected $line; // Ligne de la source de l'exception.
/* Remplacable */
function __construct ($message = NULL, $code = 0);
function __toString(); // Chaîne formatée pour l'affichage.
}
?>
Nous allons donc créer notre classe MonException qui, par exemple, réécrira le constructeur en
rendant obligatoire le premier argument ainsi que la méthode __toString pour n'afficher que le
message d'erreur
<?php
class MonException extends Exception {
public function __construct($message, $code = 0) {
parent::__construct($message, $code);
}
Maintenant que nous avons crée notre classe MonException, nous n'allons pas lancer d'exception
Exception mais une exception de type MonException.
<?php
class MonException extends Exception {
public function __construct($message, $code = 0) {
parent::__construct($message, $code);
}
return $a + $b;
}
/* Nous allons attraper les exceptions "MonException" s'il y en a une qui est
levée. */
catch (MonException $e) {
/* On affiche le message d'erreur grâce à la méthode __toString que l'on a
écrite. */
echo $e;
}
/* Ce message s'affiche, ceci prouve bien que le script est exécuté jusqu'au
bout. */
echo '<br />Fin du script';
?>
Si jamais une exception est lancée dans un bloc try mais non attrapée dans un bloc catch, alors une
erreur fatale sera levée car l'exception ne sera pas attrapée. Il existe une façon d'exécuter du code
avant de lever l'erreur fatale grâce au bloc finally.
<?php
function additionner($a, $b){
if (!is_numeric($a) || !is_numeric($b)) {
throw new Exception('Les deux paramètres doivent être des nombres');
}
return $a + $b;
}
Pour cela, nous allons avoir besoin de la fonction « set_error_handler ». Celle-ci permet
d'enregistrer une fonction en callback qui sera appelée à chaque fois qu’une erreur sera lancée.
Cette fonction permet de changer tous les messages d'erreurs en « ErrorException » qui est une
classe qui hérite de la classe « Exception ».
La fonction « set_error_handler » doit être placée avant le début du bloc try-catch, en lui passant
en paramètre le nom d'une fonction que nous allons utiliser pour convertir l’erreur en exception.
Pour illustrer au mieux cette conversion, prenons l’exemple d’une erreur assez évidente à détecter
qu’est la division d’un nombre par 0.
<?php
function error2exception($code, $message, $fichier, $ligne) {
throw new Exception($message);
}
set_error_handler('error2exception');
Tests de connaissances
1. Définir : POO, classe, objet, instance.
2. Quel est la syntaxe de déclaration d’une classe ?
3. Décrire le principe d’encapsulation et appliquer ce principe dans un exemple de votre
choix ?
4. A quoi sert le constructeur d’une classe ?
5. Comment mettre en place l’auto-chargement des classes en POO ?
6. Quelle différence faites-vous entre erreur et exception ?
7. Comment mettre en place une exception ? Illustrer avec un exemple.
8. Quelle méthode permet de convertir une erreur en exception ?
Objectifs spécifiques
Définition et manipulation de l’objet PDO
Définition du principe de connexion et de gestion une base de données à l’aide de l’objet
PDO
Utilisation du langage SQL pour la gestion des requêtes
Les Sites Web dynamiques reposent généralement sur des bases de données qui sont interrogées par
les scripts utilisés pour leur développement (comme PHP). Le contenu ainsi visible sur la page
provient partiellement (voir entièrement) de la base de données. Donc, le fait de modifier les
données stoquées dans celle-ci revient à modifier le contenu du site Web.
Le SGBD (Système de Gestion de Base de Données) le plus connu pour accompagner le langage
PHP est MySQL. Cependant, PHP peut aussi dialoguer avec plusieurs autres SGBD comme
PostgreSQL, Oracle, SQL Server...
Jusqu'à la version 5 de PHP, la connexion à une base de données (en particulier MySQL) se
faisait d'une manière transparente grâce à des fonctions du genre mysql_connect(),
mysql_select_db(), mysql_query()... Ces fonctions marchent encore sur les dernières versions
PHP5.x (y compris PHP5.6), mais elles sont rendues obsolètes à partir de PHP5.5. A la sortie de
PHP7 elles ont été supprimées.
Bien que ces fonctions marchaient très bien, leurs limites n'ont pas mis beaucoup de temps pour se
manifester, en particulier quand on souhaite migrer vers un SGBD autre que MySQL. En effet,
toutes ces fonctions préfixées par mysql_ n'auraient pas marché. Il faut par conséquent repasser en
vue une grande partie du code déjà développé.
72 M. Marc TEJIOGNI | mtejiogni@[Link] | Tél : 693 90 91 21 – 682 66 37 31
Programmation Web II 2024 / 2025
Heureusement l'objet PDO (PHP Data Object) a été développé et intégré sous forme d'extension
au langage PHP.
PDO est une extension qui s'ajoute au PHP pour que ses différentes fonctionnalités soient
disponibles dans le langage. Il constitue une interface d'abstraction de la base de données, c'est à
dire qu'on peut utiliser l'ensemble de ses fonctions pour exécuter des requêtes SQL quelque soit le
SGBD. Autrement dit, si l'application Web repose sur le SGBD MysQL, on peut migrer vers le
SGBD PostgreSQL sans modifier le code source (quelques modifications mineures sont requises).
L'abstraction de la base de données constitue un point fort par rapport aux anciennes méthodes
d'accès à celles-ci. D'ailleurs, il constitue l'ultime avantage du PDO, sans en être le seul.
Le bon fonctionnement de PDO repose sur la disponibilité du pilote de la base de données. Il faut
que celui-ci soit pris en charge pour pouvoir interroger le SGBD souhaité.
Pour déclarer le pilote du SBGD MySQL par exemple, il faut aller dans le fichier [Link] et ajouter
la ligne suivante (si elle n'est pas déjà déclarée) :
extension = php_pdo_mysql.dll
extension = php_pdo.dll
Supposons que le serveur de base de données est le serveur local (WampServer) et que la base
données (MySQL) que l'on souhaite interroger s'appelle "mabase".
Pour arriver à interroger cette base de données on utilisera le nom d'utilisateur "root" (valeur par
défaut lors de l’installation) et le mot de passe "" (valeur par défaut lors de l’installation). Bien
entendu, l'utilisateur "root" dispose de tous les privilèges pour interroger la base de données via les
scripts PHP.
On suppose maintenant que dans la base de données "mabase" on a créé une table nommée
"utilisateurs" dont la structure est la suivante :
USE mabase;
CREATE TABLE utilisateurs (
id integer not null auto_increment,
nom varchar(128) not null,
prenom varchar(128) not null,
login varchar(128) not null,
pass varchar(128) not null,
PRIMARY KEY (id)
);
Maintenant que tous les paramètres de notre base de données sont là. On va voir comment
l'interroger à l'aide de PHP via l'objet PDO.
<?php
$pdo = new PDO("mysql:host=localhost;dbname=mabase","root","");
?>
$pdo correspond à l'instance PDO créée en passant au constructeur les paramètres qui constituent la
chaîne de connexion. Trois paramètres sont renseignés :
Après le DSN on met deux points « : » suivis des mots clés « host » et « dbname »
auxquels on affecte respectivement le nom du serveur de base de données (localhost dans ce
cas) et le nom de la base de données (mabase).
Il est possible d'ajouter d'autres mots clés comme port pour désigner un numéro de port
particulier (sur lequel le SBGD écoute les requêtes) ou charset pour spécifier l'encodage (ou
jeux de caractères). Ces différents paramètres sont espacés par point virgule.
2. Le deuxième paramètre correspond au nom d'utilisateur qui doit être préalablement créé
sur le serveur de base de données. Cet utilisateur détient un certains nombre de privilèges et
il ne peut passer au serveur que les requêtes définies par les privilèges qui lui sont attribués.
<?php
try {
$pdo=new PDO("mysql:host=localhost;dbname=mabase","root","");
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
Certes PDOException permet de capturer l’exception lors de la création de l’objet PDO c'est-à-dire
lors de la connexion du script PHP avec la base de données. Mais cependant les exceptions
soulevées lors de l’exécution des requêtes (INSERT, SELECT, UPDATE, DELETE) avec l’objet
PDO ne seront pas capturées. Donc si vous essayez le code suivant vous n’aurez aucune exception
soulevée :
<?php
try {
$pdo=new PDO("mysql:host=localhost;dbname=mabase","root","");
$pdo->exec('insert into utilisateursxxx(nom, prenom, login, pass)
values("User", "User", "test","test")');
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
Et pourtant il ya bien erreur au niveau du nom de la table « utilisateurs ». Ceci est dû au fait que le
rapport d’erreurs de l’objet PDO nouvellement crée est par défaut à l’état
« ERRMODE_SILENT » : ce qui signifie qu’il assigne simplement les codes d’erreur et ne
soulève donc aucune exception.
Ainsi, pour palier à ce problème il faudrait changer l’état du rapport d’erreurs de l’objet PDO après
sa création à « ERRMODE_EXCEPTION ». Pour cela on utilise la méthode « setAttribute » qui
permet de configurer un attribut PDO. On a donc le code suivant :
<?php
try {
$pdo=new PDO("mysql:host=localhost;dbname=mabase","root","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
Il arrive également dans certains cas où l’on ne parvient à manipuler des caractères suivant
l’encodage UTF-8 avec l’objet PDO pas mauvaise configuration des paramètres d’encodage soit sur
le serveur Web (WampServer), soit la base de données créée avec MySQL.
<?php
try {
$pdo=new PDO("mysql:host=localhost;dbname=mabase","root","",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
On imagine que si notre projet Web est composé de plusieurs pages, alors la plupart d'entre elles
aura besoin de dialoguer avec la base de données. Le code précédent sera donc déclaré dans
chacune d'elles. Il faut alors songer à mettre ce code dans un fichier à part qu'on inclura au besoin (à
l'aide de include() ou require()...).
Pour préparer une requête, il est recommandé de ne pas y spécifier les valeurs, mais plutôt
remplacer celle-ci par des marqueurs interrogatifs (?) ou des paramètres nommés.
Pour mieux comprendre, supposons que l'on veut insérer dans la table "utilisateurs" les valeurs
suivantes:
Nom: Einstein
Prénom: Albert
Login: [Link]
Mot de passe: 2020
<?php
try {
$pdo=new PDO("mysql:host=localhost;dbname=mabase","root","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
La méthode prepare() de l'objet PDO permet de préparer une requête. Elle accepte comme
paramètre une chaîne de caractères qui correspond à la requête souhaitée. Les marqueurs
interrogatifs sont là pour désigner les valeurs à passer à la requête. Ces valeurs seront ensuite
passées lors de l’exécution de la requête. $req est l'objet correspondant à la requête préparée.
La méthode execute() est appelée par l'objet $req qui correspond à la requête préparée. Elle accepte
comme paramètre une variable de type tableau qui contient les valeurs qui remplaceront, dans
1
L'injection SQL est une méthode d'attaque très connue. C'est un vecteur d'attaque extrêmement puissant quand il est
bien exploité. Il consiste à modifier une requête SQL en injectant des morceaux de code non filtrés, généralement par le
biais d'un formulaire.
77 M. Marc TEJIOGNI | mtejiogni@[Link] | Tél : 693 90 91 21 – 682 66 37 31
Programmation Web II 2024 / 2025
l'ordre, les marqueurs interrogatif. Première entrée pour le premier marqueur, deuxième entrée pour
le deuxième marqueur et ainsi de suite.
Si la requête préparée ne contient aucun marqueur interrogatif alors la méthode execute() est laissée
vide.
Remarque : Vous avez sans doute remarqué que le mot de passe a été haché par la fonction md5().
Il ne faut jamais stocker les mots de passe en claire (ni dans un fichier, ni dans la base de données).
Le traitement précédent peut être fait à l'aide des paramètres nommés au lieu des marqueurs
interrogatifs comme ceci :
<?php
try {
$pdo=new PDO("mysql:host=localhost;dbname=mabase","root","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Dans la requête préparée, on déclare à la place des valeurs des séquences qui commencent par deux
points (:nom ou :prenom par exemple). Lors de l’exécution, on passe en paramètre un tableau
associatif dont les clés sont les paramètres nommés (en tant que chaînes de caractères). Les valeurs
du tableau seront les valeurs que l'on veut passer à la requête.
Cette technique ne nous oblige pas de déclarer les valeurs au sein du tableau passé lors de
l’exécution dans l'ordre établi dans la requête. C'est utile quand la requête contient un nombre
important de paramètres, ce qui rend le respect de l'ordre peu compliqué.
De la même manière on peut passer des requêtes de modification, suppression, vidage de la table...
<?php
try {
$pdo=new PDO("mysql:host=localhost;dbname=mabase","root","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
Maintenant, il faut récupérer les enregistrements dans une variable PHP. En fait, on va récupérer
toute la table dans une seule variable.
<?php
$req->setFetchMode(PDO::FETCH_ASSOC);
$tab = $req->fetchAll();
?>
setFetchMode() est une méthode qui permet de définir le mode de récupération par défaut de
données pour une requête. Cette méthode est appelée par l'objet $req (PDOStatement) et elle
accepte comme paramètre une constante de classe. Ainsi comme constantes de classe on peut
citer :
PDO::FETCH_ASSOC : permet de récupérer les données sous forme de tableau de tableau
(c'est-à-dire un tableau numérique qui contient un tableau associatif) où les lignes
représentent les lignes de la table dans la base de données et les colonnes représentent les
clés qui ne sont rien d’autre que les valeurs des attributs de la table. Exemple :
$tab[0]["nom"].
PDO::FETCH_OBJ : permet de récupérer les données sous forme de tableau numérique
d’objets où les propriétés des objets sont les attributs de la table. Exemple : $tab[0]->nom.
PDO::FETCH_CLASS : permet de récupérer les données sous forme de tableau numérique
d’objets de type classe où les propriétés des objets sont les attributs et méthodes de la classe.
Syntaxe de déclaration : $req->setFetchMode(PDO::FETCH_CLASS, ‘NomDeLaClasse’);
Exemple :
$tab = $req->fetchAll();
$tab[0]->getNom().
La méthode fetchAll() appelée par l'objet requête retourne un tableau contenant toutes les lignes
retournées par la requête.
Désormais que nous disposons de la variable $tab, on peut en faire ce qu'on veut. Si nous
choisissons d'afficher toutes les lignes sur la page. Le code ressemblerait donc à ceci:
<?php
for($i=0;$i<count($tab);$i++){
echo implode(" | ",$tab[$i])."<br />";
}
?>
Tests de connaissances
1. Définir : SGBD, PDO.
2. Pourquoi est-t-il préférable de stocker les données dans une base données au lieu d’un
fichier ?
3. Citez quelques SGBD que vous connaissez ?
4. A quoi sert l’objet PDO ? Comment déclarer objet PDO ?
5. Quel est l’avantage des requêtes préparées ?