La doc officielle
Les types
Voir la section correspondante
dans le manuel.
Les expressions ont un type, les variables pas toujours (« Le type d’une variable n’est pas toujours défini par le programmeur ; il peut être défini par PHP au moment de l’exécution, suivant le contexte dans lequel la variable est utilisée », nous dit le manuel).
Nombreuses conversions implicites (c’est à dire qu’on n’a pas toujours conscience que l’interpréteur change le type des expressions quand on les manipule).
Exemple avec le type booleen (True
, False
)
<?php
function test_bool($b)
{
echo "$b -> ";
if($b)
echo 'vrai';
else
echo 'faux';
echo "\n";
}
test_bool(True);
test_bool(False);
test_bool(0);
test_bool(00);
test_bool(1);
test_bool('');
test_bool('0');
test_bool('00');
test_bool('1');
test_bool('toto');
test_bool('True');
test_bool('False');
?>
Voici le résultat de l’exécution de ce script depuis une fenêtre de terminal :
[4-php] php types.php
1 -> vrai
-> faux
0 -> faux
0 -> faux
1 -> vrai
-> faux
0 -> faux
00 -> vrai
1 -> vrai
toto -> vrai
True -> vrai
False -> vrai
Rappel sur le fonctionnement de php
php ne connaît pas le langage html
- Il ne fait que reproduire des chaînes de caractères
- Il n’interprète que ce qui est signalé par des balises php
- Ce qui est à l’intérieur de balises php doit être du php
- Ce qui est en dehors de balises php sera recopié tel quel
- À l’intérieur des balises, pour écrire quelque chose, il faut le dire (avec
echo
)
Exemple :
Bonjour, ceci est un fichier php, qui s'appelle "texte.php".
<?php
function affiche($i)
{
echo "On m'a dit d'afficher ";
echo "$i\n";
}
echo "<p>ceci est du html</p>\n";
affiche(3);
affiche('truc');
$bob = 4+6;
affiche($bob);
?>
Maintenant je vais calculer 2+3
<?php
affiche(2+3);
echo "Encore une pour la route : ";
echo 2+3;
echo "\n";
?>
On exécute ce script php
NB : sur les machines des salles de TP, si la commande php
n’existe pas, il
faut peut-être essayer php-cli
. Je vais me renseigner.
[4-php] php texte.php
Bonjour, ceci est un fichier php, qui s'appelle "texte.php".
<p>ceci est du html</p>
On m'a dit d'afficher 3
On m'a dit d'afficher truc
On m'a dit d'afficher 10
Maintenant je vais calculer 2+3
On m'a dit d'afficher 5
Encore une pour la route : 5
[4-php]
Remarquez bien :
- Les balises <
p>
sont recopiées telles quelles - Le 2+3 n’est pas interprété, ni les guillemets, en dehors des balises
- Les sauts de ligne dans le code php, dans les balises php, ne sont
pas pris en compte - Une commande
echo
ne produit pas de saut de ligne par défaut - Pour aller à la ligne, on utilise le caractère spécial
\n
(regardez bien à quels moments le texte va à la ligne)
Mais alors pourquoi utilise-t-on php avec html ?
Le processus est le suivant :
- Le navigateur du client demande au serveur un fichier qui a l’extension
.php
- Le serveur transmet ce fichier à l’interpréteur php qui se trouve
chez lui (chez le serveur) - Une fois interprété, ce fichier produit du code html (à condition que le
développeur lui ait fait produire du html) - Le serveur envoie ce code html au navigateur du client
- Le navigateur affiche ce code html comme s’il avait demandé au
serveur un fichier html
Ceci permet de générer du code html qui change en fonction des
paramètres choisis par l’utilisateur.
include
Ce qui est inclus avec include
sera traité comme le fichier php
principal, et donc selon les mêmes règles que décrit plus haut :
- Ce qui est en dehors de balises php sera recopié tel quel
- Ce qui est à l’intérieur de balises php doit être du php
- etc.
Ayez toujours en tête la structure du fichier html qui devra être
produit à la fin.
Exemple : Le fichier test-html.php
ci-dessous.
<!DOCTYPE html>
<html>
<?php
include('head.php');
include('body.php');
?>
</html>
Le fichier head.php
:
<head>
<meta charset="utf8" />
<title>Test</title>
</head>
Le fichier body.php
:
<body>
<h1>Voilà</h1>
<p>Ca marche</p>
<p>
<?php
echo 5*8;
?>
</p>
</body>
Le résultat sur le terminal :
[4-php] php test-html.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8" />
<title>Test</title>
</head>
<body>
<h1>Voilà</h1>
<p>Ca marche</p>
<p>
40 </p>
</body>
</html>
Je mets le résultat dans un fichier :
[4-php] php test-html.php > test-html.html
Je charge ce fichier dans mon navigateur :
Comment procéder
- Avant tout, écrire le html que vous voulez afficher à la fin
- Ensuite, découper ce html pour attribuer chaque morceau à une
partie de code php - Gardez bien en tête l’ordre dans lequel doivent apparaître les
différents morceaux dans le code html final - En cas de doute, utilisez l’interpréteur du terminal pour vérifier le
code html produit
Les tableaux
Voir la section correspondante
dans le manuel.
Contrairement à java, les tableaux en php sont des dictionnaires (ou
tableaux associatifs, ou maps en anglais), c’est à dire des listes
de couples
[ clef => valeur ]
La clef est soit une chaîne de caractère, soit un entier.
Vous avez déjà pu voir ça avec le tableau $_GET
ou le tableau
$_REQUEST
pour le traitement des formulaires (voir cours précédent).
Les tableaux se parcourent fréquemment au moyen de la boucle foreach :
foreach($tab as $val) echo "valeur suivante : $val"; foreach($tab as $key => $val) echo "à la clef $key est associée la valeur $val";
Exemple :
<?php
function affiche_tab($tab)
{
foreach($tab as $param => $valeur)
echo "$param donne $valeur.\n";
echo "\n";
}
function affiche_valeurs($tab)
{
echo "Les valeurs de mon tableau :\n";
foreach($tab as $valeur)
echo "$valeur.\n";
echo "\n";
}
$cp = array(
'nom' => 'Prieur',
'prénom' => 'Christophe',
'email' => 'prieur@liafa.fr');
echo "\n";
affiche_tab($cp);
affiche_valeurs($cp);
?>
Résultat :
[4-php] php array.php
nom donne Prieur.
prénom donne Christophe.
email donne prieur@liafa.fr.
Les valeurs de mon tableau :
Prieur.
Christophe.
prieur@liafa.fr.
On peut aussi ajouter des valeurs à un tableau sans en spécifier la
clef :
$tab[] = 'toto';
Dans ce cas, la clef est fixée automatiquement à un entier, qui est le
plus petit entier qui n’a pas déjà été attribué comme clef (et 0 si
aucune valeur n’a été attribuée précédemment).
Exemple :
<?php
$tab['test'] = 6;
$tab[] = 42;
$tab[2] = 56;
echo "\n";
affiche_valeurs($tab);
for($i=0; isSet($tab[$i]); $i++)
echo "$i donne " . $tab[$i] . "\n";
echo "\n";
?>
Résultat :
Les valeurs de mon tableau :
6.
42.
56.
0 => 42
Remarquez bien :
- il n’y a pas de valeur associée à la clef 1, donc la boucle s’est
arrêtée après 0 et n’est pas allé jusqu’à 2 - la clef
'test'
n’est pas un entier mais elle définit une valeur du
tableau, comme 0 et 2 (mais pas 1).
Récapitulatif (et plus encore)
En particulier :
Mais aussi :
- Les structures de contrôle
- Les opérateurs de comparaison,
qui sont encore l’occasion de voir (comme pour les booléens au début
de ce cours) que les types sont beaucoup plus « souples » qu’en java.Bien noter la distinction == vs. ===
(et donc != vs. !==), et les tableaux
récapitulatifs de
comparaison entre types
et bon courage pour les migrainesRetenir surtout qu’il faut toujours faire plein de tests quand
vous manipulez ensemble des expressions qui n’ont pas le même type. - Les chaînes de caractères,
avec la distinction entre guillemets ‘simples’ et "doubles"
(l’interpréteur évaluera les expressions qu’il trouve à l’intérieur
des guillemets doubles, par les guillemets simples. Voir les
guillemets utilisés dans tous les exemples ci-dessus).
Sécurisation des formulaires : éviter les injections
Voir l’exemple du piratage du site de Christine Boutin à l’annonce du retrait
de sa candidature, traité dans un autre billet.
Faute de frappe à la fin : « gruillemets » (envie de gruyère ?).
Je ne suis pas d’accord avec « Les expressions ont un type, pas les variables ». La fonction `gettype` permet justement de récupérer le type… d’une variable (dixit la doc officielle). Ce n’est pas parce qu’il y a une conversion implicite ( »2 »+ »2 » = 4 (j’utilise des double-apostrophes pour éviter que WordPress transforme les guillemets)) qu’il n’y a pas de type.
Autre chose, il faut rappeler qu’à la base, PHP est un langage de template (et a été fait par quelqu’un qui avouait lui même ne rien connaître à la programmation), ce qui explique cette inclusion directement dans le code HTML.
Merci pour les précisions, j’ai corrigé.
Pour les variables, ce n’est pas si clair. Disons que certaines en ont un, mais je n’ai rien vu qui dise qu’elles ne puissent pas en changer.