Utiliser les fonctions PHP
Préambule
L’objectif de ce chapitre est de présenter les fonctions les plus utiles dans le cadre du développement d’un site web.
PHP propose de nombreuses fonctions ; la description de chaque fonction est accessible en ligne sur le site www.php.net.
Depuis la version 8, il est possible de passer des paramètres à une fonction en utilisant le nom du paramètre au lieu de sa position. Cette fonctionnalité est présentée dans le chapitre Écrire des fonctions et des classes PHP, mais elle peut être utilisée pour les fonctions natives du langage PHP, et donc pour les fonctions présentées dans ce chapitre. Par contre, dans ce chapitre, les noms réels des paramètres des fonctions ne sont pas présentés (ils sont traduits) ; pour les connaître, consultez la documentation en ligne des fonctions.
Depuis la version 8.1, passer la valeur NULL à un paramètre qui n’est pas explicitement optionnel est déprécié et génère donc une alerte de niveau E_DEPRECATED.
Exemple
<?php
$x = null;
$n = strlen($x);
?>
Résultat
Deprecated: strlen(): Passing null to parameter #1 ($string) of type string
is deprecated in /app/scripts/index.php on line 3
Manipuler les constantes, les variables et les types de données
1. Constantes
PHP propose un certain nombre de fonctions utiles sur les constantes :
Nom |
Rôle |
defined |
Indique si une constante est définie ou non. |
constant |
Retourne la valeur d’une constante. |
defined
La fonction defined permet de savoir si une constante est définie ou non.
Syntaxe
booléen defined(chaîne nom)
nom |
Nom de la constante. |
La fonction defined retourne TRUE si la constante est définie et FALSE dans le cas contraire.
Exemple
<?php
// Tester si la constante CONSTANTE est définie.
$ok = defined('CONSTANTE');
if ($ok) {
echo 'CONSTANTE est définie.<br />';
} else {
echo 'CONSTANTE n\'est pas définie.<br />';
};
// Définir la constante CONSTANTE
define('CONSTANTE','valeur de CONSTANTE');
// Tester si la constante CONSTANTE est définie.
$ok = defined('CONSTANTE');
if ($ok) {
echo 'CONSTANTE est définie.<br />';
} else {
echo 'CONSTANTE n\'est pas définie.<br />';
};
?>
Résultat
CONSTANTE n'est pas définie.
CONSTANTE est définie.
constant
La fonction constant retourne la valeur d’une constante dont le nom est passé en paramètre.
Syntaxe
mixte constant(chaîne nom)
Avec :
nom |
Nom de la constante. |
Cette fonction est pratique pour récupérer la valeur d’une constante dont le nom n’est pas connu a priori.
Exemple
<?php
// définir le nom de la constante dans une variable
$nomConstante = 'AUTRE CONSTANTE';
// définir la valeur de la constante
define($nomConstante,'valeur de AUTRE CONSTANTE');
// afficher la valeur de la constante
echo $nomConstante,' = ',constant($nomConstante);
?>
Résultat
AUTRE CONSTANTE = valeur de AUTRE CONSTANTE
D’autres fonctions permettent de connaître le type d’une constante (cf. section Manipuler les constantes, les variables et les types de données - Types de données).
2. Variables
PHP propose un certain nombre de fonctions utiles sur les variables...
Manipuler les tableaux
PHP propose un grand nombre de fonctions permettant de manipuler les tableaux.
Les fonctions les plus utilisées sont les suivantes :
Nom |
Rôle |
count |
Compte le nombre d’éléments dans un tableau. |
in_array |
Teste si une valeur est présente dans un tableau. |
array_search |
Recherche une valeur dans un tableau. |
array_replace |
Remplace des valeurs dans un tableau. |
[a|k][r]sort |
Trie un tableau (plusieurs variantes possibles). |
explode |
Découpe une chaîne selon un séparateur et stocke les éléments dans un tableau. |
implode |
Regroupe les éléments d’un tableau dans une chaîne à l’aide d’un séparateur. |
max |
Retourne la plus grande valeur stockée dans un tableau. |
min |
Retourne la plus petite valeur stockée dans un tableau. |
str_split |
Découpe une chaîne en morceaux de longueur fixe et stocke les éléments dans un tableau. |
array_column |
Retourne les valeurs d’une colonne d’un tableau multidimensionnel. |
array_key_first |
Retourne la première clé d’un tableau. |
array_key_last |
Retourne la dernière clé d’un tableau. |
Certaines fonctions modifient le contenu du tableau passé en paramètres et ne peuvent donc pas être appliquées à un tableau constant sous peine d’obtenir une erreur fatale :
Fatal error: Only variables can be passed by reference in ...
La fonction is_array (cf. section Manipuler les constantes, les variables et les types de données - Types de données) permet de savoir si une variable est de type tableau. Ne l’oubliez pas.
De nombreuses autres fonctions existent, la description de chaque fonction est accessible en ligne sur le site www.php.net. Vous y trouverez notamment des fonctions pour :
-
réaliser des calculs (somme...)
-
extraire un sous-tableau d’un tableau
-
fusionner des tableaux
-
dédoublonner un tableau...
count
La fonction count permet de connaître le nombre d’éléments dans un tableau.
Syntaxe
entier count(tableau variable)
variable |
Variable concernée. |
Si la variable est un tableau, la fonction count retourne le nombre d’éléments présents dans le tableau (0 si le tableau est vide).
Depuis la version 8, si la fonction est appliquée à une variable qui n’est pas un tableau...
Manipuler les nombres
Les fonctions les plus utiles pour manipuler les nombres sont les suivantes :
Nom |
Rôle |
abs |
Valeur absolue d’un nombre. |
ceil |
Arrondit un nombre à l’entier supérieur. |
floor |
Arrondit un nombre à l’entier inférieur. |
intdiv |
Quotient de la division entière de deux entiers. |
max |
Plus grande valeur d’une liste de nombres. |
min |
Plus petite valeur d’une liste de nombres. |
rand |
Génération de nombres aléatoires |
round |
Arrondi d’un nombre à virgule flottante. |
abs
La fonction abs retourne la valeur absolue d’un nombre.
Syntaxe
nombre abs(nombre valeur)
valeur |
Nombre à traiter. |
La fonction abs retourne un nombre du même type que le nombre passé en paramètre (entier ou nombre à virgule flottante).
Exemple
<?php
echo 'abs(123) = ',abs(123),'<br />';
echo 'abs(-321) = ',abs(-321);
?>
Résultat
abs(123) = 123
abs(-321) = 321
ceil
La fonction ceil (« plafond ») arrondit un nombre à l’entier supérieur.
Syntaxe
nombre ceil(nombre valeur)
valeur |
Nombre à traiter. |
La fonction ceil retourne un nombre entier mais dont le type de données est un nombre à virgule flottante (float).
Exemple
<?php
echo 'ceil(123.45) = ',ceil(123.45),'<br />';
echo 'ceil(-123.45) = ',ceil (-123.45);
?>
Résultat
ceil(123.45) = 124
ceil(-123.45) = -123
floor
La fonction floor (« plancher ») arrondit un nombre à l’entier inférieur.
Syntaxe
nombre floor(nombre valeur)
valeur |
Nombre à traiter. |
La fonction floor retourne un nombre entier mais dont le type de données est un nombre à virgule flottante (float).
Exemple
<?php
echo 'floor(1234.56) = ',floor(1234.56),'<br />';
echo 'floor(-1234.56) = ',floor (-1234.56);
?>
Résultat
floor(1234.56) = 1234
floor(-1234.56) = -1235
intdiv
La fonction intdiv retourne le quotient de la division entière de deux entiers.
Syntaxe
entier intdiv(entier dividende, entier diviseur)
dividende |
Dividende. |
diviseur |
Diviseur. |
Si les deux paramètres ne sont pas de type entier, ils sont convertis en entiers avant le calcul, en utilisant les règles...
Manipuler les chaînes de caractères
Les fonctions les plus utiles pour manipuler les chaînes de caractères sont les suivantes :
Nom |
Rôle |
strlen |
Retourne le nombre de caractères d’une chaîne. |
strtolower strtoupper ucfirst ucwords lcfirst |
Conversions minuscules/majuscules éventuellement limitées au(x) premier(s) mot(s). |
strcmp strcasecmp |
Comparaison de chaîne (sensible à la casse ou non). |
[s]printf v[s]printf |
Mise en forme d’une chaîne (identique aux fonctions C équivalentes). |
number_format |
Mise en forme d’un nombre. |
[l|r]trim |
Suppression de caractères "blancs". |
substr |
Extraction d’une sous-chaîne dans une chaîne. |
str_repeat |
Construction d’une chaîne par répétition de caractères. |
str[r][i]pos |
Recherche de la position d’une occurrence (caractère ou chaîne) à l’intérieur d’une chaîne. |
str[i]str strrchr |
Extraction de la sous-chaîne dans une chaîne commençant à partir d’une certaine occurrence d’un caractère ou d’une chaîne. |
str_[i]replace |
Remplacement des occurrences d’une chaîne par une autre chaîne. |
strtr |
Remplacement des occurrences d’un caractère par un autre caractère ou d’une chaîne par une autre chaîne. |
str_contains |
Détermine si une chaîne contient une autre chaîne (apparue en version 8). |
str_starts_with |
Détermine si une chaîne commence par une autre chaîne (apparue en version 8). |
str_ends_with |
Détermine si une chaîne se termine par une autre chaîne (apparue en version 8). |
N’oubliez pas les fonctions explode, implode et str_split précédemment présentées (cf. section Manipuler les tableaux). D’autres fonctions, plus spécifiquement liées à la gestion des formulaires, sont étudiées dans le chapitre Gérer les formulaires et les liens.
Depuis la version 8.2, les fonctions qui effectuent des conversions de casse (strtolower, strtoupper, lcfirst, ucfirst, ucwords) ou des recherches/comparaisons insensibles à la casse (stristr, stripos, strripos, str_ireplace) ne tiennent plus compte des caractéristiques linguistiques locales éventuellement définies par l’intermédiaire...
Utiliser les expressions rationnelles
1. Introduction
Une expression rationnelle est une chaîne de caractères qui décrit le modèle (encore appelé motif) recherché dans une autre chaîne de caractères. Les expressions rationnelles sont très utiles et très efficaces pour effectuer des vérifications ou des manipulations parfois complexes sur les chaînes de caractères.
Le terme anglais « regular expression » est très souvent traduit à tort par « expression régulière ».
PHP propose une extension pour utiliser les expressions rationnelles : PCRE (Perl Compatible Regular Expression).
Cette extension (fonctions preg_*) utilise pratiquement la même syntaxe que le langage Perl pour écrire l’expression rationnelle.
2. Structure d’une expression rationnelle
Une expression rationnelle Perl doit être encadrée par un caractère délimiteur. Ce délimiteur peut être n’importe quel caractère à l’exception de l’antislash (\) ; très souvent le caractère slash (/) est utilisé. Il est possible aussi d’utiliser les délimiteurs (), {}, [] et <>.
Exemple (délimiteurs en gras)
/http:\/\/(.*)/
{http://(.*)}
Comme le montre le premier exemple ci-dessus, si le caractère délimiteur est présent dans le motif recherché, il doit être échappé par un antislash (\). Dans ce cas, utiliser un autre délimiteur que le / (# par exemple) permet d’obtenir une expression plus lisible.
Après le délimiteur de fermeture, il est possible de préciser des options qui vont modifier le comportement de la recherche.
Exemple (options en gras et utilisation du caractère # comme délimiteur)
#http://(.*)#is
Les principales options sont présentées dans la suite.
Dans une expression rationnelle, la plupart des caractères se représentent eux-mêmes. Ainsi l’expression /http/ permet de rechercher la chaîne http.
Mais la puissance des expressions rationnelles réside dans l’existence de caractères spéciaux (métacaractères) qui sont interprétés pour décrire le motif recherché....
Manipuler les dates
PHP ne gère pas les dates avec un type de donnée spécifique. Néanmoins, des dates peuvent être manipulées, soit sous la forme d’une chaîne de caractères, soit sous la forme d’un timestamp Unix (correspondant au nombre de secondes écoulées depuis le 1er janvier 1970 01:00:00). Il existe aussi plusieurs classes qui offrent des fonctionnalités avancées pour la manipulation des dates (classe DateTime) et des intervalles (classe DateInterval) sous une forme orientée objet (voir la documentation).
Plusieurs fonctions permettent de manipuler les dates sous l’une ou l’autre de ces formes :
Nom |
Rôle |
checkdate |
Vérifie que trois entiers représentant le jour, le mois et l’année correspondent à une date valide. |
date |
Convertit en chaîne une date donnée sous la forme d’un timestamp Unix. |
strftime |
Convertit en chaîne une date donnée sous la forme d’un timestamp Unix, en utilisant des caractéristiques locales. |
datefmt_create |
Définit un format qui peut être utilisé pour con-vertir une date en chaîne à l’aide de la fonction datefmt_format. |
datefmt_format |
Formate une date/heure sous forme de chaîne à l’aide d’un format créé au préalable avec la fonction datefmt_create. |
getdate |
Stocke dans un tableau les différentes composantes d’une date donnée sous la forme d’un timestamp Unix. |
date_parse_from_format |
Stocke dans un tableau les différentes composantes d’une date donnée sous la forme d’une chaîne de caractères. |
time |
Donne le timestamp Unix actuel. |
mktime |
Crée un timestamp Unix à partir des différentes composantes d’une date. |
microtime |
Donne le timestamp Unix actuel accompagné du nombre de microsecondes écoulées depuis la dernière seconde. |
hrtime |
Retourne un temps écoulé à partir d’un instant arbitraire, avec une grande précision. |
idate |
Donne les composantes d’une date fournie sous la forme d’un timestamp Unix. |
L’appel de certaines fonctions peut générer une alerte de niveau E_NOTICE si le fuseau horaire n’est pas correctement défini (voir la directive de configuration date.timezone...
Générer un identifiant unique
Dans certaines situations, il peut être nécessaire de générer des identifiants uniques.
PHP propose la fonction uniqid pour générer des identifiants uniques.
Syntaxe
chaîne uniqid()([chaîne préfixe [, booléen plus_unique]])
préfixe |
Préfixe à ajouter à l’identifiant. Mettre une chaîne vide ou ne rien mettre si vous ne souhaitez pas de préfixe. |
plus_unique |
Si ce paramètre est positionné à TRUE, des données supplémentaires sont ajoutées à la fin de la valeur retournée pour obtenir un identifiant plus long et plus difficilement identifiable. |
La fonction uniqid retourne une chaîne de treize caractères, ou vingt-trois si le paramètre plus_unique est à TRUE (sans compter le préfixe), calculée à partir de l’heure courante en microsecondes.
Exemple
<?php
echo uniqid(),'<br />';
echo uniqid(),'<br />';
echo uniqid('abc'),'<br />';
echo uniqid('',TRUE) ,'<br />';
?>
Résultat
603e17c1be84f
603e17c1be861
abc603e17c1be862
603e17c1be8635.27083137
Cet exemple montre que l’identifiant généré est bien unique, même si la différence entre...
Manipuler les fichiers sur le serveur
1. Fonctions utiles
PHP propose un grand nombre de fonctions permettant de manipuler les fichiers sur le serveur.
Les fonctions les plus utiles sont les suivantes :
Nom |
Rôle |
fopen |
Ouvrir un fichier |
fclose |
Fermer un fichier |
fread |
Lire le contenu d’un fichier (dans une chaîne) |
file |
Lire le contenu d’un fichier (dans un tableau) |
readfile |
Lire le contenu d’un fichier et l’envoyer directement vers la sortie |
fwrite |
Écrire dans un fichier |
file_get_contents |
Ouvrir, lire et fermer un fichier |
file_put_contents |
Ouvrir, écrire et fermer dans un fichier |
copy |
Copier un fichier |
unlink |
Supprimer un fichier |
rename |
Renommer un fichier |
file_exists |
Tester l’existence d’un fichier |
filesize |
Lire la taille d’un fichier |
chdir |
Changer de répertoire courant |
opendir |
Ouvrir un répertoire |
closedir |
Fermer un répertoire |
readdir |
Lire le contenu d’un répertoire |
scandir |
Lister le contenu d’un répertoire (dans un tableau) |
Certaines de ces fonctions vont prendre comme paramètre un nom de fichier ou de répertoire. Sur une plate-forme Windows, pour spécifier un chemin d’accès dans une chaîne de caractères délimitée par des guillemets, vous devez échapper l’antislash (par un antislash = \\) ou vous pouvez utiliser une notation type "Unix", avec des slashs (/). Par exemple, le chemin c:\temp\info.txt peut être écrit "c:\\temp\\info.txt" ou "c:/temp/info.txt". Si aucun chemin n’est indiqué, c’est le répertoire courant qui est utilisé. Des noms relatifs peuvent être spécifiés en utilisant le caractère . (point) pour désigner le répertoire courant, et .. (deux points) pour désigner le répertoire supérieur.
La constante prédéfinie DIRECTORY_SEPARATOR donne le caractère de séparation utilisé dans les noms de répertoire pour la plate-forme sur laquelle PHP est installé. La constante prédéfinie PHP_EOL donne la séquence de caractères utilisée par la plate-forme pour représenter une nouvelle ligne.
Par ailleurs, plusieurs fonctions possèdent un paramètre (appelé utiliser_inclusion dans les syntaxes de cet ouvrage)...
Manipuler les en-têtes HTTP
La fonction header permet d’envoyer des en-têtes HTTP avec la page HTML.
Syntaxe simplifiée
header(chaîne en-tête[, booléen remplacer[, entier code_réponse]])
en-tête |
Chaîne à envoyer comme en-tête HTTP avec la page HTML. |
remplacer |
Indique si la fonction doit remplacer un en-tête précédemment émis (valeur TRUE, par défaut) ou bien ajouter un nouvel en-tête (valeur FALSE). |
code_réponse |
Code réponse HTTP. |
Les différents en-têtes HTTP sont décrits dans la RFC 2616.
Par exemple, la fonction header peut être utilisée pour envoyer un en-tête qui interdit la mise en cache de la page par le client ou par un proxy. Ce besoin est assez fréquent dans les scripts PHP qui génèrent du HTML dynamique dont le contenu change en fonction de l’utilisateur.
Exemple
// HTTP 1.0
header("Pragma: no-cache");
// HTTP 1.1
header("Cache-Control: no-cache, must-revalidate");
Dans la suite de cet ouvrage, nous aurons l’occasion d’utiliser la fonction header dans plusieurs situations :
-
redirection HTTP (cf. chapitre Gérer les formulaires et les liens) ;
-
identification HTTP (cf. chapitre Gérer les sessions, section Authentification) ;
-
téléchargement (download) d’un document (cf. chapitre...
Exercices
1. Exercice 3 : manipuler les données
Maintenant que nous avons étudié un grand nombre de fonctions PHP, nous pouvons simplifier le code que nous avions écrit dans l’exercice 2, afficher des informations supplémentaires et modifier la présentation de certaines données.
Étape 1
Pour commencer, nous allons afficher un nouveau message donnant la date du jour, simplifier le code qui compte le nombre de lettres du nom et celui qui détermine si le nom commence par une voyelle.
Indications :
-
Dans un nouveau répertoire, copiez les scripts accueil.php et commun.inc.php développés dans l’exercice 2.
-
Dans le script accueil.php, après le message de bienvenue, affichez un nouveau message donnant la date du jour sous la forme « Nous sommes le .... » avec une date au format JJ/MM/AAAA.
-
Simplifiez le code qui compte le nombre de caractères du nom en utilisant une fonction PHP à la place de la boucle while.
-
Simplifiez le code qui détermine si le nom conmmence par une voyelle ou une consonne en utilisant des fonctions PHP à la place de la structure de contrôle if ou switch. Par exemple, vous pouvez définir un tableau (ou une chaîne) qui contient la liste des voyelles et tester si la première lettre du nom est dans ce tableau (ou dans cette chaîne). Gérez aussi le cas où le nom ne commence pas par une lettre majuscule comme supposé initialement.
Résultat attendu (sans affichage du tableau des auteurs)
Bonjour Olivier.
Bienvenue sur monSite.com.
Nous sommes le 17/03/2023.
Votre nom comporte 7 lettres.
Votre nom commence par une voyelle.
Solution (code PHP modifié)
<?php
// Afficher les messages
echo "Bonjour $nom.<br />";
echo 'Bienvenue sur ',NOM_SITE,'.<br />';
// Afficher la date.
echo 'Nous sommes le ',date('d/m/Y'),'.<br />';
// Compter le nombre de lettres du nom.
echo 'Votre nom comporte ',strlen($nom),' lettres.<br />';
// Déterminer si le nom commence par une voyelle ou une consonne.
$voyelles = ['A','E','I','O','U','Y'];
if (in_array(strtoupper($nom[0]),$voyelles))...