← PHP 8.4 — ingénierie et préparation Zend

Module 1 / 8 · 90 min

Types, tableaux, chaînes et comparaisons

Distinguer absence, valeur fausse, égalité stricte et conversion.

Votre progression apparaîtra ici lorsque JavaScript est actif.

La progression et le meilleur score sont enregistrés uniquement dans ce navigateur. Aucun compte n’est nécessaire ; effacer les données du navigateur les supprime. Les durées de modules sont indicatives et incluent les exercices.

Comprendre le mécanisme

PHP associe un type à chaque valeur. Un tableau est une table ordonnée de clés et de valeurs, pas seulement une liste. Les clés numériques écrites comme chaînes peuvent être normalisées ; distinguez une liste JSON d’un objet. Une comparaison stricte vérifie valeur et type, alors qu’une comparaison faible peut convertir les opérandes. isset considère une valeur null comme absente ; array_key_exists vérifie la présence de la clé. Ces différences deviennent des décisions métier lorsqu’un champ peut être volontairement vide.

Raisonner et vérifier

Avant un calcul, définissez le contrat d’entrée : type attendu, borne et signification de null. Ne transformez pas automatiquement une entrée invalide en zéro. Les chaînes PHP contiennent des octets ; strlen ne mesure pas les caractères Unicode. Pour une recherche qui peut retourner zéro, comparez explicitement avec false. Les expressions régulières valident une forme, sans remplacer les règles métier.

Le contrat appartient aussi au site d’appel

Un type scalaire protège une frontière d’appel, mais son comportement dépend du contexte PHP. Pour un appel direct à une fonction utilisateur, strict_types est déterminé par le fichier appelant. Déclarer la fonction dans un fichier strict ne rend donc pas automatiquement strict un autre fichier qui l’appelle. Séparez cette règle de la validation d’une quantité : un entier négatif reste un entier parfaitement valide pour le langage.

Erreur fréquente à comprendre

strict_types rend toute donnée réseau valide.

Le typage d’appel ne vérifie pas les invariants métier.

Présence, absence et null

Une donnée peut être absente, présente avec null ou présente avec une valeur vide. Ces trois états peuvent demander des décisions différentes dans une modification partielle de profil. array_key_exists détecte la clé même si sa valeur est null ; isset retourne alors false. Un paramètre nullable autorise null dans le contrat, sans décider si null signifie suppression, valeur inconnue ou erreur métier dans votre API.

Erreur fréquente à comprendre

Une valeur null convient à tout paramètre int non nullable.

Le contrat doit annoncer cette possibilité.

Lire une union avant d’utiliser sa valeur

Une union représente plusieurs possibilités encore ouvertes. Avec un résultat entier ou false, commencez par distinguer explicitement false, puis utilisez l’entier restant. strpos peut retourner zéro pour une occurrence au début : une condition de vérité seule perd cette occurrence valide. Le principe est de réduire les possibilités par une garde qui correspond au contrat réel de la fonction, plutôt que de supposer une valeur favorable.

Erreur fréquente à comprendre

Une union permet toute opération de n’importe quel membre.

L’opération doit convenir au type réellement présent.

Égalité de représentation et égalité de valeur

La comparaison faible peut rapprocher une chaîne numérique et un entier. La comparaison stricte exige aussi le même type : le texte « 42 » ne devient pas identique à l’entier 42. Choisissez la règle selon le domaine. Pour un identifiant reçu du réseau, validez sa grammaire et sa représentation avant comparaison ; ne laissez pas une coercition implicite décider si deux identités sont équivalentes.

Erreur fréquente à comprendre

La comparaison stricte convertit toujours chaînes et nombres.

Elle évite cette coercition de comparaison.

Table associative ou liste ordonnée

Un tableau PHP organise des clés et des valeurs ; il ne promet pas des indices continus. Retirer un élément peut laisser un trou et influencer la sérialisation JSON. Avant de renvoyer une liste, vérifiez le contrat des indices et réindexez lorsque c’est réellement souhaité. Une table de configuration avec des clés métier doit, au contraire, conserver ces clés : réindexer aveuglément ferait perdre leur signification.

Erreur fréquente à comprendre

Tout tableau PHP est nécessairement une liste continue.

Les clés peuvent être associatives ou discontinues.

Une conversion n’est pas une validation

Un cast réalise une transformation selon les règles du langage. Il ne prouve pas que l’entrée respecte la grammaire attendue par votre application. Transformer immédiatement une valeur en entier peut mélanger donnée incorrecte et zéro légitime. Un parseur robuste distingue d’abord absence et type, vérifie ensuite la forme admissible, puis applique les bornes. La réponse d’erreur doit conserver cette distinction au lieu de fabriquer une valeur apparemment valide.

Erreur fréquente à comprendre

Tout cast conserve intégralement le sens métier.

La conversion doit suivre un contrat d’entrée.

Décimaux et exactitude monétaire

Un flottant binaire ne représente pas exactement tous les décimaux usuels. Un calcul affiché avec deux chiffres peut masquer une approximation interne. Pour un montant, choisissez des entiers dans une unité explicitement définie ou un outil décimal approprié. L’unité, les arrondis et les limites font partie du contrat d’échange ; le type float et un formatage d’affichage ne suffisent pas à établir l’exactitude du calcul.

Erreur fréquente à comprendre

Un float garantit tous les calculs monétaires exacts.

Le domaine monétaire demande une représentation adaptée.

Initialiser avant de lire

Une propriété typée peut être dans un état non initialisé, distinct d’une valeur null autorisée. Son type ne lui donne pas automatiquement zéro ou une chaîne vide. Le constructeur doit établir les invariants nécessaires avant que les autres méthodes l’utilisent. Testez une construction valide et les chemins incomplets. Ajouter une valeur par défaut arbitraire peut seulement cacher qu’une information obligatoire n’a jamais été fournie.

Erreur fréquente à comprendre

Toute propriété int possède automatiquement zéro après construction.

L’accès exige une initialisation conforme au contrat.

Une chaîne est une séquence d’octets

PHP peut conserver dans une string des octets qui ne forment aucun texte UTF-8 valide. strlen mesure cette longueur en octets, pas un nombre universel de caractères visibles. Pour une limite de fichier, cette mesure est pertinente ; pour un libellé international, définissez l’encodage et la notion de longueur attendue. Les validations de texte, le stockage et la présentation doivent employer le même contrat.

Erreur fréquente à comprendre

Toute string PHP est automatiquement un texte UTF-8 valide.

La validité d’encodage doit être établie si elle est requise.

Du type à la permission

Recevoir un identifiant entier établit au mieux une propriété de représentation. Cela ne démontre pas que l’acteur peut lire la ligne correspondante. Après validation du format, résolvez la ressource dans le périmètre autorisé et vérifiez l’opération demandée. Un test complet essaie le même identifiant avec le propriétaire et avec un autre compte : les deux entrées sont bien typées, mais leurs permissions peuvent différer.

Erreur fréquente à comprendre

Un identifiant int donne accès à toute ligne correspondante.

L’autorisation demeure une règle indépendante.

Atelier guidé : lire, expliquer et vérifier le code

<?php
declare(strict_types=1);
$value = '42';
var_dump($value == 42, $value === 42);

Dans l’exercice guidé, value contient une chaîne dont les deux caractères représentent un nombre. La première comparaison utilise les règles de l’égalité faible et obtient true. La seconde ajoute l’exigence de type : string et int sont différents, donc elle obtient false. strict_types n’interdit pas ces opérateurs et ne transforme pas la variable avant comparaison.

Reproduisez le programme dans un fichier de laboratoire, puis remplacez successivement la valeur par l’entier 42, la chaîne vide et null. Notez séparément le type et les deux résultats. Terminez par un parseur qui accepte seulement la représentation décidée pour votre API. Cette dernière étape vérifie le contrat métier ; elle ne se déduit pas du simple succès d’une comparaison.

strict_types : examiner le fichier qui appelle

<?php // amount.php
declare(strict_types=1);
function amount(int $value): int { return $value; }

<?php // endpoint.php — fichier distinct, sans strict_types
require 'amount.php';
var_dump(amount('1500'));

Pour cet appel direct à une fonction utilisateur, le mode strict des paramètres scalaires dépend du fichier appelant. Déclarer la fonction dans un fichier strict ne rend pas automatiquement strict le fichier qui l’utilise. Dans le scénario posé, l’appelant non strict peut convertir la chaîne numérique '1500' en entier.

Créez deux fichiers appelants qui invoquent la même fonction typée int, l’un avec strict_types=1 et l’autre sans. Vérifiez le type reçu et le refus du chemin strict pour la chaîne. Cette comparaison isole la règle au lieu de changer simultanément fonction, valeur et contexte.

Le typage ne remplace pas une validation du montant. Un entier converti avec succès peut dépasser un plafond, porter la mauvaise unité ou viser une opération interdite. À une frontière JSON, définissez les représentations admises et validez-les avant d’appeler le domaine, afin que le contrat ne dépende pas accidentellement de la permissivité d’un fichier.

Points de vigilance : Pour cet appel direct et ces arguments scalaires, le mode du fichier appelant s’applique. La déclaration int est effective : la chaîne numérique est convertie ici. L’appelant non strict permet la conversion de cette chaîne numérique en int. Les fichiers peuvent avoir des modes différents ; les frontières doivent être maîtrisées.

Documentation de référence ↗

Exemple commenté

<?php
declare(strict_types=1);
$data = ['limit' => null];
var_dump(isset($data['limit']));
var_dump(array_key_exists('limit', $data));
var_dump(strpos('stock', 's') !== false);

Le programme affiche false, true, true. Une clé présente peut contenir null ; une occurrence à la position zéro est une occurrence valide.

Exercice de mise en pratique

Écrivez un parseur de quantité qui distingue champ absent, chaîne vide, entier zéro, nombre positif et texte non numérique.

Voir une proposition de correction

Validez d’abord la présence et le format, puis la borne strictement positive. Retournez une erreur structurée pour chaque classe invalide ; ajoutez les cas 0, "0", null et "12x" aux tests.

Points de vérification

  • Tester les bornes et les valeurs fausses.
  • Distinguer octets et caractères.
  • Employer === lorsque le type fait partie du contrat.

Contrôle de connaissances

Cours associé : Types, tableaux, chaînes et comparaisons ↗
Une clé existe et contient null. Quel test confirme sa présence ?

Documentation de référence ↗

Validation du module

101 questions, objectif pédagogique de 75 %. Durée conseillée de 150 minutes, sans limite imposée. Les questions et les choix sont mélangés ; le corrigé apparaît après validation. Le contrôle rapide de la leçon et l’examen final du cours restent des exercices distincts.

Commencer ou reprendre les 101 questions →