Tu veux insérer des variables dans un texte avec un format précis ? La fonction sprintf en PHP te permet de créer des chaînes formatées proprement. Tu peux aligner des nombres, ajouter des zéros devant, ou réorganiser tes variables facilement.
Cette fonction existe depuis PHP 4. Elle fonctionne dans toutes les versions modernes du langage.
Table des matières
Signature de la fonction
sprintf(string $format, mixed ...$valeurs): string
Explication des paramètres :
$format(obligatoire) : ta chaîne avec des marqueurs de position (ex.%s,%d,%f).$valeurs(optionnel) : les valeurs à insérer dans l’ordre des marqueurs.
Principaux marqueurs :
%s: chaîne de caractères (string).%d: nombre entier (integer).%f: nombre à virgule flottante (float).%x: nombre hexadécimal.
Directives de formatage
Les directives contrôlent comment sprintf() affiche tes valeurs. Chaque directive commence par % suivi de caractères spécifiques.
Structure d’une directive complète
%[argument][signe][padding][largeur][.précision]type
Types de base (obligatoires)
| Type | Description | Exemple |
|---|---|---|
%s | Chaîne de caractères | sprintf("%s", "Bonjour") → « Bonjour » |
%d | Nombre entier | sprintf("%d", 42) → « 42 » |
%f | Nombre décimal | sprintf("%f", 3.14) → « 3.140000 » |
%x | Hexadécimal minuscule | sprintf("%x", 255) → « ff » |
%X | Hexadécimal majuscule | sprintf("%X", 255) → « FF » |
%b | Binaire | sprintf("%b", 5) → « 101 » |
%o | Octal | sprintf("%o", 8) → « 10 » |
%% | Caractère % littéral | sprintf("50%%") → « 50% » |
Précision (décimales)
La notation .X définit le nombre de décimales.
sprintf("%.2f", 3.14159); // "3.14"
sprintf("%.0f", 3.14159); // "3"
sprintf("%.4f", 3.1); // "3.1000"
Largeur (espacement)
Le nombre définit la largeur minimale de la chaîne.
sprintf("%5d", 42); // " 42" (complète avec espaces)
sprintf("%10s", "test"); // " test"
Padding (remplissage)
Le caractère 0 remplit avec des zéros au lieu d’espaces.
sprintf("%05d", 42); // "00042"
sprintf("%08.2f", 3.1); // "00003.10"
Alignement
Le signe - aligne à gauche au lieu de droite.
sprintf("%-10s", "test"); // "test "
sprintf("%-5d", 42); // "42 "
Signe explicite
Le caractère + affiche toujours le signe.
sprintf("%+d", 42); // "+42"
sprintf("%+d", -42); // "-42"
Ordre des arguments
%2$ permet de réorganiser les variables.
sprintf("%2$s a %1$d ans", 25, "Marie");
// "Marie a 25 ans"
Exemples combinés
// Padding + précision
sprintf("%08.2f", 3.5); // "00003.50"
// Largeur + alignement
sprintf("%-15s : %5d", "Total", 42);
// "Total : 42"
// Signe + padding
sprintf("%+05d", 7); // "+0007"
Exemples pour la fonction sprintf en PHP
Exemple 1 : Usage basique
$nom = "Marie";
$age = 28;
echo sprintf("Bonjour %s, tu as %d ans.", $nom, $age);
// "Bonjour Marie, tu as 28 ans."
Exemple 2 : Formatage de nombres
$prix = 19.5;
echo sprintf("Prix : %.2f €", $prix);
// "Prix : 19.50 €"
$nombre = 7;
echo sprintf("Numéro : %03d", $nombre);
// "Numéro : 007" (complète avec des zéros)
Exemple 3 : Réorganiser les arguments
$quantite = 12;
$produit = "pommes";
echo sprintf("Le %2$s contient %1$d %2$s.", $quantite, $produit);
// "Le pommes contient 12 pommes."
Exemple 4 : Cas réels
Générer code promo formaté :
$id = 42;
echo sprintf("PROMO-%05d", $id);
// "PROMO-00042"
Message de log structuré :
$user = "admin";
$action = "suppression";
$timestamp = time();
$log = sprintf("[%d] %s a effectué : %s", $timestamp, $user, $action);
// "[1736486400] admin a effectué : suppression"
Exemple 5 : Alignement des colonnes
$produits = [
['Pomme', 2.50],
['Banane', 1.20],
['Orange', 3.00]
];
foreach ($produits as [$nom, $prix]) {
echo sprintf("%-10s %6.2f €\n", $nom, $prix);
}
// "Pomme 2.50 €"
// "Banane 1.20 €"
// "Orange 3.00 €"
Cas d’usage pratiques
- Codes produits :
sprintf("SKU-%06d", $id)génère SKU-000042. - Messages templates : créer des emails ou logs structurés.
- Formatage prix : toujours 2 décimales avec
%.2f. - Tableaux CLI : aligner des colonnes de données.
- Requêtes SQL : construire des valeurs formatées (avec échappement).
Bonnes pratiques / pièges
1. Différence sprintf() vs printf() vs vsprintf()
Point clé : ces trois fonctions utilisent les mêmes directives mais diffèrent par leur sortie.
| Fonction | Comportement | Cas d’usage |
|---|---|---|
sprintf() | Retourne la chaîne | Stocker, manipuler, assigner |
printf() | Affiche directement | Echo rapide, CLI, logs |
vsprintf() | Accepte tableau arguments | Arguments dynamiques |
// sprintf : stocke
$message = sprintf("Total : %d €", 50);
echo $message; // "Total : 50 €"
// printf : affiche directement
printf("Total : %d €", 50); // Affiche "Total : 50 €"
// vsprintf : arguments en tableau
$format = "Nom : %s, Age : %d";
$args = ["Marie", 28];
echo vsprintf($format, $args); // "Nom : Marie, Age : 28"
2. Gestion des caractères spéciaux et encodage
Point clé : sprintf() ne gère pas l’encodage UTF-8 automatiquement.
Largeur avec caractères multibytes
$nom = "François"; // 8 caractères, mais "ç" = 2 octets UTF-8
sprintf("%10s", $nom); // " François" (compte 9 octets, pas 8 caractères)
// Résultat visuel décalé !
// ✅ Solution : mb_strlen pour calculer
$largeur = 10 - mb_strlen($nom, 'UTF-8');
sprintf("%{$largeur}s%s", "", $nom);
Caractères spéciaux dans format
// ❌ Guillemets doubles = interpolation
$var = "test";
sprintf("Valeur : %s", $var); // OK
// ⚠️ Variables dans format
$format = "Total : %d";
sprintf($format, 50); // OK mais attention aux injections
// ✅ Format littéral sécurisé
sprintf('Total : %d', 50); // Guillemets simples = pas d'interpolation
3. Comportement avec arguments manquants ou en excès
Point clé : PHP 8.0+ est strict sur le nombre d’arguments.
Arguments manquants
// PHP 7.x : Warning
sprintf("Nom : %s, Age : %d", "Jean");
// Warning + affichage partiel
// PHP 8.0+ : ValueError (erreur fatale)
sprintf("Nom : %s, Age : %d", "Jean");
// ValueError: 2 format specifiers, 1 argument
Arguments en excès
// ✅ Ignorés sans erreur
sprintf("Nom : %s", "Jean", 35, "Paris");
// "Nom : Jean" (35 et "Paris" ignorés)
Gestion sécurisée
// ❌ Risqué
$format = $_GET['format']; // Contrôlé par utilisateur
sprintf($format, $data);
// ✅ Format fixe
$formats = [
'simple' => "Nom : %s",
'complet' => "Nom : %s, Age : %d"
];
sprintf($formats[$_GET['type']], $nom, $age);
4. BONUS : Compatibilité avec types stricts
phpdeclare(strict_types=1);
function afficher(int $nombre): string {
return sprintf("%d", $nombre);
}
afficher(42); // ✅ "42"
afficher("42"); // ❌ TypeError en mode strict
afficher(3.14); // ❌ TypeError en mode strict
// sprintf force la conversion APRÈS le type hint
Piège 1 : Nombre d’arguments incorrect
// ❌ Erreur : 2 marqueurs, 1 valeur
echo sprintf("Nom : %s, Age : %d", "Jean");
// ValueError en PHP 8.0+
// ✅ Arguments complets
echo sprintf("Nom : %s, Age : %d", "Jean", 35);
Piège 2 : Type incompatible
$texte = "abc";
echo sprintf("Nombre : %d", $texte);
// "Nombre : 0" (conversion forcée)
// ✅ Utilise le bon marqueur
echo sprintf("Texte : %s", $texte);
Piège 3 : Sécurité et injection
// ❌ Risque injection
$input = $_GET['nom'];
$sql = sprintf("SELECT * FROM users WHERE nom = '%s'", $input);
// ✅ Utilise prepared statements
$stmt = $pdo->prepare("SELECT * FROM users WHERE nom = ?");
$stmt->execute([$input]);
Performance et limites
Points forts :
- Lisibilité : format clair pour messages complexes.
- Précision : contrôle total sur formatage nombres/textes.
- Réutilisable : templates stockables en base/config.
Limites :
- Plus lent que la concaténation simple (2-3x).
- Complexité : marqueurs avancés (
%'x9d) peu intuitifs. - PHP 8.0+ : erreurs strictes si arguments manquants.
- Gros volumes : sur 100 000+ appels, perte notable vs concat
Alternatives
| Besoin | Fonction |
|---|---|
| Affichage direct | printf() |
| Formatage avancé | number_format() |
| Templates complexes | Moteurs Twig/Blade |
| Simple concat | Opérateur . ou interpolation |
✅ Nouveauté majeure affectant sprintf depuis PHP 8.4 : Optimisation automatique du compilateur
PHP 8.4 introduit une optimisation révolutionnaire pour sprintf(). Le moteur PHP compile automatiquement certains appels en interpolation de chaînes.
Conditions d’optimisation :
- Format avec uniquement
%set%d. - Pas de formatage complexe (pas de padding, précision, etc.).
Transformation automatique :
// Code écrit
sprintf('user_%s_%d', $name, $id);
// Compilé automatiquement en
"user_{$name}_{$id}"
- Suppression du coût d’appel de fonction.
- Parsing du format éliminé.
- Performance identique à l’interpolation native.
- 90% des usages de
sprintf()dans Symfony Benchmark concernés.
Cette optimisation fonctionne sans modification de code. Tu peux utiliser sprintf() pour la lisibilité sans perte de performance.
retour à la liste des fonctions
Sources : php.net