Un langage de script, comme Python ou bash
Spécialement conçu pour des applications web (architecture client/serveur)
Idée de départ : rendre « simple » la réalisation de sites web dynamiques en permettant d'inclure des instructions dans le code HTML (en pratique, très souvent mal utilisé)
Pas le meilleur langage de programmation, mais s'est progressivement amélioré dans les dernières années (versions 7 et 8)
Toujours très utilisé, notamment par Wikipédia et Facebook (mais les internautes ne le voient pas), et surtout par les principaux CMS (WordPress, Drupal, Joomla), qui permettent aux administrateurs de modifier leur fonctionnement en changeant le code
De nos jours, PHP se veut un langage généraliste — pas seulement utile pour faire des pages web.
dans ce cours on commence par présenter PHP en ligne de commande, avant de l'utiliser côté serveur.
Dès le départ, PHP a été construit incrémentalement, en fonction des besoins (de Rasmus Lerdorf au début, puis de la communauté), et en agrégeant des idées de diverses origines
Cela se sent dans la syntaxe : les variables et les boucles sont celles de Perl, les références sont celles de C++, le modèle objet est celui de Java, etc.
Il y a de nombreuses façons de faire la même chose (plusieurs syntaxes pour le if
par exemple)
On ne verra pas tout le langage !
<?php
echo "Hello, world!\n";
<?php
echo
permet d'afficher quelque chosephp
$ php mon_script.php
Hello, world!
//
, ou à la shell avec #
(la suite de la ligne est ignorée)/* ... */
(permet de commenter plusieurs lignes)
<?php
$message = "Bonjour, oh monde !";
echo $message;
Bonjour, oh monde !
$
suivi d'un symbole fait de lettres minuscules ou majuscules, de chiffres et de soulignés.
$toto
≠ $Toto
≠ $TOTO
$_REQUEST
) et il est donc conseillé de ne pas utiliser de nom de variable commençant par un souligné.NULL
, qui n'a que la valeur NULL
define('TOTO', valeur);
pour définir la constante TOTO
define
,
on met le nom de la constante dans une chaîne de caractères, mais on utilise la constante
sans guillemets !
const
:
const TOTO = 'Toto Dupont';Cependant ça ne fonctionne pas tout à fait pareil : les constantes déclarées avec
const
sont définies à la compilation, alors que celles déclarées avec define
le sont à l'exécution. En pratique :
$var = 'une variable'; define('TOTO', $var); /* OK */ const TUTU = $var; /* Fatal error */
On a très souvent besoin d'inclure du code d'un autre fichier PHP (ou HTML)
include
: génère simplement un warning en cas d'échecrequire
: arrête le programme avec une erreur fatale en cas d'échec,
donc rien ne s'afficheInstructions include_once
et require_once
pour éviter une inclusion multiple
La gestion des chemins (quels accès sont autorisés ou non, quelle est la référence des chemins relatifs dans un script inclus depuis un autre script…) est relativement infernale : ne pas essayer de faire des choses subtiles, ou prévoir un stock d'aspirine
print_r
, var_export
ou var_dump
affichent le contenu d'une variable de façon lisible (démo)debug_print_backtrace()
affiche la backtrace de PHP (appels aux fonctions, aux fichiers inclus / requis, etc)+ - * / %
.
— Attention, ce n'est pas +
!)
<?php
echo "cou" . "cou\n"; // concaténation
//echo "cou" + "cou\n"; // somme : les chaînes étaient implicitement
// converties en entiers avant PHP 8,
// maintenant ça génère une TypeError
echo "\n";
echo 7 . 2; // affiche 72
echo "\n";
echo 7. . .2; // affiche 70.2 (équivaut à "7." . ".2")
coucou 72 70.2
L'opérateur est .
justement à cause du typage faible, pour garder +
pour l'addition
= += -= *= /= .=
== != <> <= >= === !==
(voir plus loin)|| && and or xor !
(int) (float) (string) (array) (object)
$condition ? 'valeur si vrai' : 'valeur si faux'
(attention, leur chaînage est contre-intuitif : il faut toujours utiliser des parenthèses)==
et !=
sont très dangereux, pour deux raisons distinctes.
Une conséquence amusante est que l'opérateur ==
n'est pas transitif :
par exemple, '0' == 0
(la chaîne de caractère est automatiquement convertie en entier),
0 == 'toto'
(idem, et la conversion donne 0 car la chaîne ne commence pas par un nombre),
mais
'0' != 'toto'
.
Les résultats peuvent être surprenants : false == '0'
mais false != '00'
par exemple.
(Tableaux des résultats de comparaison en fonction des types)
Par exemple, '1' == '1.0'
, '10' == '010'
, et '1000' == '1e3'
(notation scientifique)…
et les chaînes de caractères suivantes sont toutes égales (car leur valeur numérique est 0) :
'0'
, '0000'
, '0.'
, '0.0000'
,
'0e1'
, mais aussi '1234e-56789'
(à cause de l'arrondi) !
PHP fournit également un opérateur d'égalité stricte (identité) ===
(et sa négation !==
) :
il vérifie l'égalité des valeurs et des types, et se comporte correctement sur les chaînes de caractères.
Toujours utiliser ===
et !==
pour comparer des chaînes de caractères
(ou des données dont le type n'est pas certain) !
En revanche, pour comparer des nombres qui peuvent être entiers ou flottants, il
peut être opportun d'utiliser ==
(car par exemple 0 !== 0.0
, ce qui dans certains cas n'est pas ce qu'on veut)
'
) sont laissés tels quels
"
, les variables sont substituées par leur valeur,
et on peut utiliser certaines séquences d'échappement
\n
pour fin de ligne, \t
pour tabulation, \$
pour dollar,
\[0-7]{1,3} pour un caractère donné en octal, \x[0-9A-Fa-f]{1,2}
pour un caractère donné en hexadécimal,
\"
pour "
et \\
pour \
\'
et \\
comme échappement. Pour x
autre que '
ou \
, \x
donne \x
.
<?php
for($i = 1; $i <= 10; $i++) {
echo "$i ($i*3)\n";
}
1 (1*3) 2 (2*3) 3 (3*3) 4 (4*3) 5 (5*3) 6 (6*3) 7 (7*3) 8 (8*3) 9 (9*3) 10 (10*3)
PHP manipule les chaînes de caractères comme des suites d'octets
Si on met un caractère spécial, la chaîne contiendra la suite d'octet
correspondant à l'encodage du fichier .php
dans lequel elle est définie
Les fonctions de manipulation de chaînes « de base » considèrent qu'un caractère = un octet, ce qui n'est pas forcément vrai si les chaînes ne contiennent pas de l'ASCII
Il faut utiliser les fonctions dédiées aux chaînes « multi-octets »
if ... else if ... else
for (...; ...; ...)
while
do ... while
switch
avec case ... break;
Voir les détails dans le manuel
<?php
function fact($x) {
if ($x <= 1)
return 1;
return $x * fact($x-1);
}
echo "5! = " . fact(5);
echo "50! = " . fact(50);
5! = 12050! = 3.0414093201713E+64
function
return
pour sortir de la fonction et retourner (ou pas) une valeur
<?php
function toto() { echo "fonction toto\n"; }
function Toto() { echo "fonction Toto\n"; }
PHP Fatal error: Cannot redeclare Toto() (previously declared in /blabla/toto.php:2) in /blabla/toto.php on line 3
Attention, il est autorisé de passer trop d'arguments à une fonction : cela ne génère même pas une notice.
On peut définir des paramètres optionnels ayant une valeur par défaut :
<?php
function saluer($nom="chère personne") {
echo "Bonjour, $nom !\n";
}
saluer("Jean-Michel");
saluer();
Bonjour, Jean-Michel ! Bonjour, chère personne !
Existence de nombreuses bibliothèques, par ex.
On différencie usuellement tableaux numériques et tableaux associatifs, mais c'est une seule et même structure de données, le « tableau associatif ordonné » (ordered map). On peut d'ailleurs mélanger les deux types d'indices.
<?php
$couleurs = array(
"black", "yellow", "fuchsia",
);
$couleurs[] = "pink";
echo "My favorite colors:\n";
for ($i = 0; $i < count($couleurs); $i++) {
echo " - the color {$couleurs[$i]};\n";
}
My favorite colors: - the color black; - the color yellow; - the color fuchsia; - the color pink;
array
crée un tableau ; on peut
aussi utiliser la syntaxe « littéral » avec des crochets : $tab = [ 4, 8, 7 ];
count
donne le nombre d'entrées du tableau, qui est dynamique.$couleurs[] = "rouge";
PHP permet de mettre des chaînes de caractères comme indices ; on parle alors de tableaux associatifs
Ils se comportent à peu près comme des dictionnaires en Python, mais sont ordonnés
<?php
$couleurs = array(
"red" => "#FF0000",
"white" => "#FFFFFF",
"blue" => "#0000FF",
);
echo $couleurs["blue"];
#0000FF
array(...)
avec =>
$couleurs["green"] = "#00FF00";
<?php
foreach ($couleurs as $c) {
echo "$c\n";
}
#FF0000 #FFFFFF #0000FF
=>
<?php
foreach ($couleurs as $c => $rgb) {
echo "la couleur $c a pour code hexa $rgb\n";
}
la couleur red a pour code hexa #FF0000 la couleur white a pour code hexa #FFFFFF la couleur blue a pour code hexa #0000FF