Le langage PHP Historique * 1994: création du langage par Rasmus Lerdorf * Pour sa page personnelle * PHP = Personal Home Page * 1997: PHP 3 * PHP est devenu un projet collectif * PHP = PHP: Hypertext Preprocessor (Acronyme récursif comme LINUX) * 2001: PHP 4 * 2004: PHP 5 * Programmation objet * 2015: PHP 7 * Certaines fonctions deviennent obsolètes Page statique / page dynamique * Page HTML = page statique * Extension ".htm" ou ".html" * Transmise directement au client * Code source lisible par le client * Page PHP = page dynamique * Extension ".php", ".php3" ou ".php4" * Conseil: utiliser plutôt l'extension ".php" * Interprétée par le serveur * Génère du HTML transmis au client * Code source non lisible par le client HTML et PHP * Code PHP inséré dans code HTML * Balise de début: <?php * Balise de fin: ?> * Exemple très simple <html> <head> <title>Hello World !</title> </head> <body> <?php echo "Hello World !"; ?> </body> </html> Génération de code HTML * "echo" permet de générer du HTML * Equivalent de "document.write" en JavaScript * Côté serveur: code PHP + HTML <html> <body> <?php echo "<b>Hello World !</b>"; ?> </body> </html> * Côté client: code HTML <html> <body> <b>Hello World !</b> </body> </html> Langage PHP * Syntaxe similaire à Java * Instructions terminées par ";" * Commentaires * "//" pour une seule ligne * "/*...*/" pour plusieurs lignes * Opérateurs identiques * Structures de contrôle identiques * Sensible à la casse * Nom des variables précédé d'un "$" * Variables faiblement typées * Pas de type prédéfini * Type peut changer en cours d'exécution Variables (1/2) * Déclaration implicite * $nom_variable = valeur; * Aucun mot-clé particulier * Déclarée à la première utilisation * Portée de la variable limitée au bloc d'instructions * Bloc d'instructions = zone entre "{" et "}" * En dehors de tout bloc = variable globale * Dans le bloc d'une fonction = variable locale * Pour utiliser une variable globale * Mot-clé "global" * global $nom_variable Variables (2/2) * Exemple de manipulation de variables $a = 7; $b = 3; function fois2($n) { $a = 2 * $n; return $a; } echo "Double de ".$b." = ".fois2($b); echo "Valeur de a = ".$a; * Résultat de l'exemple Double de 3 = 6 Valeur de a = 7 * Modification de la fonction function fois2($n) { global $a; $a = 2 * $n; return $a; } * Résultat avec la modification Double de 3 = 6 Valeur de a = 6 Types de données * Type déterminé à l'initialisation de la variable * Booléen * $x = TRUE; * $x = FALSE; * Entier * $x = 27; * Flottant * $x = 27.13; * Chaîne de caractères * $x = "Nawouak"; * $x = "27"; * Le type d'une variable peut changer en cours d'exécution $x = 5; ... $x = "cinq"; Opérateurs * Opérateurs classiques * Arithmétique: +, -, *, /, % * Affectation: =, +=, -=, *=, /=, %=, --, ++ * Logique: && (ou and), || (ou or), ! * Comparaison: ==, <, >, <=, >=, != * Test sur les variables * isset($var) * "TRUE" si "$var" existe * "FALSE" sinon * empty($var) * "TRUE" si "$var" n'existe pas ou nulle (zéro, chaîne vide) * "FALSE" sinon Structures de contrôle (1/4) * Bloc d'instructions délimité par "{" et "}" * Facultatif si une seule ligne * if ($x == 1) $y = 2; ? if ($x == 1) { $y = 2; } * Structures conditionnelles * if (test1) action1 else if (test2) action2 else action3 * switch (variable) case valeur1: action1 case valeur2: action2 default: action3 * Structures de boucle * while (test) action * do action while (test) * for (depart; test; suivant) action Structures de contrôle (2/4) * "une année bissextile est un multiple de 4, mais pas de 100, mais de 400" * Version 1 if ($annee % 4 != 0) { $bissextile = FALSE; } else if ($annee % 100 != 0) { $bissextile = TRUE; } else if ($annee % 400 != 0) { $bissextile = FALSE; } else { $bissextile = TRUE; } * Version 2 if ($annee % 4 == 0) { if ($annee % 100 == 0) { if ($annee % 400 == 0) { $bissextile = TRUE; } else { $bissextile = FALSE; } } else { $bissextile = TRUE; } } else { $bissextile = FALSE; } Structures de contrôle (3/4) * Exemple: conversion d'un chiffre en lettres * Version avec "if" imbriqués if ($x == 1) $texte = "un"; else if ($x == 2) $texte = "deux"; ... else if ($x == 9) $texte = "neuf"; else $texte = "zéro"; * Version avec "switch" switch ($x) { case 1: $texte = "un"; break; case 2: $texte = "deux"; break; ... case 9: $texte = "neuf"; break; default: $texte = "zéro"; } Structures de contrôle (4/4) * Exemple: calcul de 9! = 9 x 8 x ... x 2 x 1 * Calcul avec boucle "for" $f = 1; for ($i = 2; $i < 10; $i++) { $f *= $i; } * Calcul avec boucle "while" $f = 1; $i = 2; while ($i < 10) { $f *= $i; $i++; } * Calcul avec boucle "do...while" $f = 1; $i = 2; do { $f *= $i; $i++; } while ($i < 10); Chaînes de caractères (1/3) * Délimiteurs et concaténation * Variables non évaluées avec "'" 'salut $nom' ==> salut $nom * Variables évaluées avec """ "salut $nom" ==> salut Bruno "${formation}2007" ==> mmi2007 * Opérateur de concaténation "salut ".$nom ==> salut Bruno * Symbole \ * \$ ==> $ * \\ ==> \ * \" ==> " * \' ==> ' * \n ==> nouvelle ligne Chaînes de caractères (2/3) * Comment mettre un délimiteur dans une chaîne ? * Problème identique en JavaScript * Exemple: générer le code HTML d'une image * Code HTML à générer * <img src="nawouak.gif"/> * Nom de l'image dans une variable * $image = "nawouak.gif"; * Plusieurs possibilités * Opérateur de concaténation * echo "...".$image."..." * Evaluation de "$image" dans chaîne * echo "...$image..." * Pas d'équivalent en JavaScript * Choix du délimiteur "'" ou """ * echo "..." ou echo '...' * Alternance des délimiteurs "'" et """ * echo "...'...'..." Chaînes de caractères (3/3) Tableaux simples (1/2) * La déclaration du tableau n'est pas nécessaire * Le remplissage du tableau n'est pas forcément continu $menu[3] = "CV"; $menu[1] = "Accueil"; $menu[7] = "Photos"; * Les indices sont facultatifs, la numérotation commence à 0 $menu[] = "Accueil"; $menu[] = "CV"; $menu[] = "Photos"; * Déclaration accélérée * $menu = array("Accueil","CV","Photos"); * Connaître le nombre d'éléments * $nb = count($menu); Tableaux simples (2/2) * Parcours des éléments * Code PHP for ($i = 0; $i < count($menu); $i++) { echo "Rubrique $i: $menu[$i]<br/>"; } * Code HTML généré Rubrique 0: Accueil<br/> Rubrique 1: CV<br/> Rubrique 2: Photos<br/> * Uniquement pour un remplissage continu ! Fonctions (1/3) * Permettent de factoriser / réutiliser du code * Portions de code associées à un nom * Reçoivent des arguments (paramètres) en entrée * Retournent une valeur en sortie * function nom(arguments) { action; return resultat; } * Exemple function calculerAire($l,$h) { $a = $l * $h; return $a; } Fonctions (2/3) * Passage d'un argument par valeur * function f($x) * L'argument "$x" est une copie * Modification limitée à "f" * function calcAire1($l,$h) { return ($l * $h); } * $w = calcAire1($u,$v); * Passage d'un argument par référence * function f(&$x) * L'argument "$x" est un alias * Modification répercutée hors de "f" * function calcAire2($l,$h,&$a) { $a = $l * $h; } * calcAire2($u,$v,$w); * A l'appel, aucune différence y = f($x); Fonctions (3/3) * Possibilité de rassembler des fonctions dans un fichier * "include" inclut et exécute un fichier * Alerte en cas d'absence * "require" inclut et exécute un fichier * Erreur en cas d'absence * Exemple * Fichier "fonctions.php" contenant une fonction <?php ... function calculerAire($l,$h) { return ($l * $h); } ... ?> * Utilisation du fichier et de la fonction <?php include("fonctions.php"); ... echo "Aire = ".calculerAire(5,13); ... ?> Tableaux associatifs (1/3) * Tableaux indexés par des chaînes * Association d'une clé (chaîne) à un élément * Tableau simple: association entier-élément * Initialisation d'un tableau * $menu["home"] = "Accueil"; $menu["cv"] = "CV"; $menu["photos"] = "Photos"; * $menu = array( "home" => "Accueil", "cv" => "CV", "photos" => "Photos"); Tableaux associatifs (2/3) * Parcours des éléments * Code PHP foreach ($menu as $element) { echo "Rubrique \"$element\"<br/>"; } * Code HTML généré Rubrique "Accueil"<br/> Rubrique "CV"<br/> Rubrique "Photos"<br/> * Fonctionne aussi pour des tableaux simples ! Tableaux associatifs (3/3) * Parcours des couples clé-élément * Code PHP foreach ($menu as $cle => $element) { echo "Rubrique <a href='$cle.htm'>"; echo "$element</a><br/>"; } * Code HTML généré Rubrique <a href='home.htm'>Accueil</a><br/> Rubrique <a href='cv.htm'>CV</a><br/> Rubrique <a href='photos.htm'>Photos</a><br/> |