214 votes

Pourquoi utiliser la fonction sprintf en PHP ?

J'essaie d'en savoir plus sur la fonction PHP sprintf() mais php.net ne m'a pas beaucoup aidé car je suis toujours confus, pourquoi vouloir l'utiliser ?

Jetez un coup d'œil à mon exemple ci-dessous.

Pourquoi l'utiliser :

$output = sprintf("Here is the result: %s for this date %s", $result, $date);

Alors que ceci fait la même chose et est plus facile à écrire IMO :

$output = 'Here is the result: ' .$result. ' for this date ' .$date;

Est-ce que je rate quelque chose ici ?

47 votes

+1, bonne question. Je l'utilise rarement moi-même, donc je suis intéressé de voir les réponses.

0 votes

Je l'utilise personnellement lorsque je concatène beaucoup de choses. Ce n'est qu'à ce moment-là que je le trouve utile, principalement pour la lisibilité.

143voto

Isak Savo Points 15357

sprintf possède toutes les capacités de formatage du printf original, ce qui signifie que vous pouvez faire bien plus que simplement insérer des valeurs variables dans des chaînes de caractères.

Par exemple, vous pouvez spécifier le format des nombres (hex, décimal, octal), le nombre de décimales, le remplissage, etc. Cherchez printf sur Google et vous trouverez de nombreux exemples. Le site article de wikipedia sur printf devrait vous permettre de commencer.

54 votes

Il y a des années, j'ai écrit une belle fonction pour mettre les nombres à zéro. Je l'ai utilisée pendant des années avant de me rendre compte que je pouvais simplement faire sprintf('%03d', $num)

8 votes

PHP sprintf a toutes les capacités de formatage ... manque en fait un élément important, %,8d par exemple pour obtenir le nombre entier de 8 chiffres alignés à droite et séparés par des virgules. Utilisation de number_format est moins pratique dans un printf le style.

4 votes

@DisgruntledGoat Pouvez-vous décomposer cette chaîne de formatage ('%03d') ? Je pense que cela pourrait être très utile. Merci.

84voto

macinjosh Points 2212

Il existe de nombreux cas d'utilisation de sprintf, mais l'une des façons dont je les utilise est de stocker une chaîne de caractères comme ceci : 'Hello, My Name is %s' dans une base de données ou comme constante dans une classe PHP. Ainsi, lorsque je veux utiliser cette chaîne, je peux simplement faire ceci :

$name = 'Josh';
// $stringFromDB = 'Hello, My Name is %s';
$greeting = sprintf($stringFromDB, $name);
// $greetting = 'Hello, My Name is Josh'

Essentiellement, cela permet une certaine séparation dans le code. Si j'utilise "Hello, My Name is %s" à de nombreux endroits dans mon code, je peux le remplacer par "%s is my name" à un endroit et il sera mis à jour automatiquement partout ailleurs, sans devoir aller dans chaque instance et déplacer les concaténations.

9 votes

Ceci. Maintenant, ajoutez les arguments numérotés et les traductions :]

0 votes

Mais vous auriez tout aussi bien pu utiliser la concaténation de chaînes de caractères dans ce cas. Ou est-ce que je ne comprends pas ?

52voto

Ken Keenan Points 5173

Une autre utilisation de sprintf est dans les applications localisées comme les arguments de sprintf ne doivent pas nécessairement être dans l'ordre où ils apparaissent dans la chaîne de format.

Ejemplo:

$color = 'blue';
$item = 'pen';

sprintf('I have a %s %s', $color, $item);

Mais une langue comme le français ordonne les mots différemment :

$color = 'bleu';
$item = 'stylo';

sprintf('J\'ai un %2$s %1$s', $color, $item);

(Oui, mon français est nul : j'ai appris l'allemand à l'école !)

En réalité, vous utiliseriez gettext pour stocker les chaînes de caractères localisées, mais vous voyez l'idée.


41voto

raspi Points 2792

C'est plus facile à traduire.

echo _('Here is the result: ') . $result . _(' for this date ') . $date;

Les chaînes de traduction (gettext) sont maintenant :

  • Voici le résultat :
  • pour cette date

Lorsqu'il est traduit dans une autre langue, cela peut être impossible ou donner lieu à des phrases très bizarres.

Maintenant, si vous avez

echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);

La traduction (gettext) des chaînes est maintenant :

  • Voici le résultat : %s pour cette date %s

Ce qui est beaucoup plus logique et beaucoup plus souple à traduire dans d'autres langues.

2 votes

Je vois où cela pourrait être très utile +1

9 votes

Bien que pour les traductions, il serait probablement préférable d'utiliser des spécificateurs de position, afin de permettre une certaine flexibilité supplémentaire lors de la traduction, par ex : echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date); Cela permettrait à une traduction de modifier la phrase comme suit . For the date %2$s, the result is %1$s

2 votes

Même s'ils ne sont pas présents dans la chaîne originale, vous pouvez les mettre dans la traduction et ils fonctionneront.

17voto

Xeoncross Points 13263

La meilleure raison que j'ai trouvée est qu'elle vous permet de placer toutes les chaînes de langue dans votre fichier de langue où les gens peuvent les traduire et les ordonner selon les besoins - mais vous savez toujours que, quel que soit le format de la chaîne, vous souhaitez afficher le nom de l'utilisateur.

Par exemple, votre site dira "Welcome back [[User]]" en haut de la page. En tant que programmeur, vous ne savez pas ou de soins comment les gars de l'interface utilisateur vont écrire cela - vous savez juste que le nom d'un utilisateur va être affiché quelque part dans un message.

Vous pouvez donc intégrer le message dans votre code sans vous préoccuper de ce qu'est réellement ce message.

Fichier de langue (EN_US) :

...
$lang['welcome_message'] = 'Welcome back %s';
...

Vous pouvez alors prendre en charge n'importe quel type de message dans n'importe quelle langue en l'utilisant dans votre code php actuel.

sprintf($lang['welcome_message'], $user->name())

0 votes

Je n'ai jamais eu à me préoccuper de faire des fichiers de langue, mais cela me semble être l'une des utilisations les plus utiles.

0 votes

Cet exemple était également parfaitement logique pour moi, car je n'ai pas fait beaucoup d'applications multilingues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X