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 encore confus, pourquoi voudriez-vous l'utiliser?

regardez mon exemple ci-dessous.

Pourquoi utiliser ceci:

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

quand cela 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 manque quelque chose ici?

168
demandé sur JasonDavis 2009-09-07 00:09:37

20 réponses

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 les chaînes.

par exemple, spécifiez le format des nombres (hex, décimal, octal), le nombre de décimales, le remplissage et plus. Google pour printf et vous trouverez beaucoup d'exemples. L'article de wikipedia sur le printf devrait vous aider à démarrer.

119
répondu Isak Savo 2009-09-06 20:13:37

il y a beaucoup de cas d'utilisation pour sprintf mais une façon que 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. De cette façon, 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, il permet une certaine séparation dans le code. Si J'utilise 'Hello, My Name is %s' dans de nombreux endroits de mon code je peux le changer en '%s est mon nom' dans un endroit et il met à jour partout ailleurs de façon automatique, sans devoir aller à chaque instance et se déplacer autour des concaténations.

73
répondu macinjosh 2009-09-06 20:20:50

une autre utilisation de sprintf est dans les applications localisées car les arguments de sprintf n'ont pas à être dans l'ordre où ils apparaissent dans la chaîne de format.

exemple:

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

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

mais une langue comme le français commande les mots différemment:

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

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

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

en réalité, vous utilisez gettext pour stocker le des cordes localisées, mais vous avez l'idée.


42
répondu Ken Keenan 2013-01-19 22:46:12

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

quand il est traduit dans une autre langue, il peut être impossible ou il en résulte des phrases très bizarres.

maintenant si vous avez

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

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

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

ce qui fait beaucoup plus de sens et il est beaucoup plus souple pour traduire à d'autres langues

35
répondu raspi 2009-09-06 22:09:07

la meilleure raison que j'ai trouvé est qu'il vous permet de placer toutes les chaînes de langue dans votre fichier de langue où les gens peuvent traduire et les commander au besoin - pourtant, vous savez toujours que peu importe le format de la chaîne est dans - vous souhaitez montrer le nom de l'utilisateur.

par exemple, votre site affichera" Welcome back [[User]] " en haut de la page. Comme le programmeur vous ne savez pas ou de soins comment les gars de L'UI vont écrire que - vous sachez juste qu'un nom d'utilisateur va être affiché quelque part dans un message.

donc vous pouvez intégrer le message dans votre code sans vous soucier de ce que ce message est réellement.

fichier Lang (FR):

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

alors vous pouvez supporter n'importe quel type de message dans n'importe quelle langue en utilisant ceci dans votre code php réel.

sprintf($lang['welcome_message'], $user->name())
16
répondu Xeoncross 2009-09-06 21:59:58

comme mentionné, il permet le formatage des données d'entrée. Par exemple, en forçant 2DP, des nombres à 4 chiffres, etc. C'est très utile pour construire des chaînes de requête MySQL.

un autre avantage est qu'il vous permet de séparer la disposition de la chaîne de caractères des données qui y sont introduites, presque comme s'alimenter en paramaters. Par exemple, dans le cas D'une requête MySQL:

// For security, you MUST sanitise ALL user input first, eg:
$username = mysql_real_escape_string($_POST['username']); // etc.
// Now creating the query:
$query = sprintf("INSERT INTO `Users` SET `user`='%s',`password`='%s',`realname`='%s';", $username, $passwd_hash, $realname);

cette méthode a bien sûr d'autres utilisations, comme lors de l'impression de sortie comme HTML, etc.

éditer: pour des raisons de sécurité , en utilisant une technique comme ci-dessus vous devez assainir toutes les variables d'entrée avec mysql_real_escape_string() avant d'utiliser cette méthode , pour prévenir les attaques D'insertion MySQL. si vous analysez des entrées non initialisées, votre site et votre serveur seront piratés . (À l'exception, bien sûr, des variables qui ont été complètement construites par votre code et sont garanties d'être sûres.)

8
répondu Samuel Jaeschke 2009-09-07 04:45:56

pourquoi voudriez-vous utiliser?

cela s'avère très utile lors de l'utilisation d'une source (externe) pour les chaînes de langage. Si vous avez besoin d'un nombre fixe de variables dans une chaîne multilingue donnée, vous n'avez besoin de connaître que l'ordre correct:

fr.txt

not_found    = "%s could not be found."
bad_argument = "Bad arguments for function %s."
bad_arg_no   = "Bad argument %d for function %s."

hu.txt

not_found    = "A keresett eljárás (%s) nem található."
bad_argument = "Érvénytelen paraméterek a(z) %s eljárás hívásakor."
bad_arg_no   = "Érvénytelen %d. paraméter a(z) %s eljárás hívásakor."

les variables insérées il n'est même pas nécessaire d'être au début ou à la fin dans plusieurs langues, seul leur ordre compte.

bien sûr, vous pouvez écrire votre propre fonction pour effectuer ce remplacement, sans doute même avec quelques augmentations mineures de performance, mais il est beaucoup plus rapide de juste (étant donné que vous avez une classe Language pour lire les chaînes de langue) :

/**
 * throws exception with message($name = "ExampleMethod"):
 *  - using en.txt: ExampleMethod could not be found.
 *  - using hu.txt: A keresett eljárás (ExampleMethod) nem található.
 */
throw new Exception(sprintf(Language::Get('not_found'), $name));

/**
 * throws exception with message ($param_index = 3, $name = "ExampleMethod"):
 *  - using en.txt: Bad argument 3 for function ExampleMethod.
 *  - using hu.txt: Érvénytelen 3. paraméter a(z) ExampleMethod eljárás hívásakor.
 */
throw new Exception(sprintf(Language::Get('bad_arg_no'), $param_index, $name));

il est également livré avec la pleine capacité de printf , donc est également un une doublure pour formater de nombreux types de variables, par exemple:

8
répondu John Weisz 2017-05-23 12:10:46

en utilisant sprintf () est beaucoup plus propre et plus sûr pour formater votre chaîne.

par exemple, quand vous avez affaire à des variables d'entrée, il prévient les surprises inattendues en spécifiant le format attendu à l'avance (par exemple, que vous attendez la chaîne [ %s ] ou le nombre [ %d ]). Cela pourrait potentiellement aider avec le risque possible de injection SQL , mais il n'empêchera pas si la chaîne de citation.

il aide aussi à traiter les flotteurs, vous pouvez spécifier explicitement la précision du chiffre (par exemple %.2f ) qui vous sauve de l'utilisation des fonctions de conversion.

les autres avantages sont que la plupart des principaux langages de programmation ont leur propre implémentation de sprintf() , donc une fois que vous vous en êtes familiarisé, c'est encore plus facile à utiliser, plutôt que d'apprendre un nouveau langage (comme comment concaténer les chaînes ou convertir les floats).

En résumé, c'est une bonne pratique à utiliser afin d'avoir un plus propre et plus lisible le code.

par exemple, voir ci-dessous exemple réel :

$insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";

ou un exemple simple qui imprime par exemple '1','2','3','4' :

print "foo: '" . $a . "','" . $b . "'; bar: '" . $c . "','" . $d . "'" . "\n";

et impression avec chaîne formatée:

printf("foo: '%d','%d'; bar: '%d','%d'\n", $a, $b, $c, $d);

printf() est équivalent à sprintf() , mais il affiche une chaîne formatée, au lieu de retourner (à la variable).

Qu'est-ce qui est le plus lisible?

6
répondu kenorb 2017-06-23 14:50:23

même si je pensais la même chose à moins que je l'ai utilisé récemment. Lorsque vous générez des documents basés sur les entrées de l'utilisateur, ce sera pratique.

"<p>Some big paragraph ".$a["name"]." again have tot ake care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragarapoh.";

qui peut être facilement écrit comme

sprintf("Some big paragraph %s. Again have to take care of space and stuff.%s also wouldnt be hard to keep track of punctuations and stuff in a really %s paragraph",$a,$b,$c);
4
répondu swordfish 2011-09-30 09:18:24

:

"<p>Some big paragraph ".$a["name"]." again have to take care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragraph.";

pourrait aussi s'écrire:

"<p>Some big paragraph {$a['name']} again have to take care of space and stuff .{$a['age']} also would be hard to keep track of punctuations and stuff in a really {$a['token']} paragraph.";

à mon avis, c'est plus clair à lire, mais je peux voir l'utilisation pour la localisation, ou formatage.

4
répondu Thomas Tremain 2012-11-17 04:45:53

certains des cas typiques sont où vous avez besoin d'un contrôle plus précis sur le format de sortie. Il peut être difficile, par exemple, assurez-vous qu'une valeur spécifique a quantité spécifique d'espaces rembourré à l'avant, en fonction de sa longueur, ou qu'un nombre est imprimée dans un format précis.

il y a beaucoup d'exemples dans le manuel PHP

Aussi ce qui vient à votre exemple de "plus facile à écrire".. Alors que l'écho peut être plus facile à écrire, le sprintf est plus facile à lire, surtout si vous avez beaucoup de variables.

une autre raison d'utiliser sprintf ou printf pourrait être que vous voulez laisser un utilisateur définir le format de sortie d'une certaine valeur - vous pouvez lui permettre en toute sécurité de définir un format de sortie compatible sprintf.

OH, et votre exemple est en fait erroné pour une partie. sprintf renvoie la chaîne, mais echo ne renvoie pas - echo la renvoie immédiatement et rien, alors que sprintf le renvoie.

3
répondu Jani Hartikainen 2009-09-06 20:15:52
  1. si vous avez utilisé C/C++, alors vous seriez utilisé pour la fonction sprintf.

  2. il y a de bonnes chances que la deuxième ligne soit moins efficace. Echo est conçu comme une commande de sortie, tandis que sprintf est conçu pour effectuer la substitution de jeton de chaîne. Je ne suis pas une personne PHP, mais je soupçonne qu'il y a d'autres objets impliqués dans l'écho. Si elle agit comme Java, il crée une nouvelle chaîne chaque fois que quelque chose est ajouté à la liste, pour que vous finissiez avec 4 cordes créées.

3
répondu Paul 2009-09-06 20:17:29

parfois j'ai quelque chose comme ça, que je considère un peu plus facile à lire:

$fileName = sprintf('thumb_%s.%s', 
                    $fileId,
                    $fileInfo['extension']);
3
répondu vise 2009-09-06 20:25:29

j'utilise habituellement sprintf pour m'assurer qu'un id qui provient de l'entrée de l'utilisateur est un entier par exemple:

// is better use prepared statements, but this is practical sometimes
$query = sprintf("SELECT * from articles where id = %d;",$_GET['article_id']);

est également utilisé pour faire des gabarits rudimentaires (pour les courriers html ou d'autres choses), de sorte que vous pouvez réutiliser un le modèle dans de nombreux endroits:

$mail_body = "Hello %s, ...";
$oneMail = sprintf($mail_body, "Victor");
$anotherMail = sprintf($mail_body, "Juan");

il est très utile aussi de formater des nombres dans différentes représentations (octal, contrôle de la place décimale, etc).

3
répondu Castro 2009-09-06 22:13:35
define('TEXT_MESSAGE', 'The variable "%s" is in the middle!');

sprintf(TEXT_MESSAGE, "Var1");
sprintf(TEXT_MESSAGE, "Var2");
sprintf(TEXT_MESSAGE, "Var3");
3
répondu Mee 2010-08-08 02:18:19

sprintf est particulièrement utile pour formater des chaînes qui utilisent des nombres. Par exemple,

$oranges = -2.34;
echo sprintf("There are %d oranges in the basket", $oranges);

Output: There are -2 oranges in the basket

Oranges est formaté comme un nombre entier (-2), mais s'enroule autour de nombres positifs si on utilise %u pour les valeurs non signées. Pour éviter ce comportement, j'utilise la fonction absolue, abs (), pour arrondir le nombre vers zéro comme suit:

$oranges = -5.67;
echo sprintf("There are %d oranges in the basket", abs($oranges));

Output: There are 5 oranges in the basket

le résultat final est un énoncé avec une grande lisibilité, la construction logique, clair formatage, et flexibilité pour l'ajout de variables supplémentaires si nécessaire. À mesure que le nombre de variables augmente en combinaison avec les fonctions qui manipulent ces variables, les avantages deviennent plus apparents. Comme dernier exemple:

$oranges = -3.14;
$apples = 1.5;
echo sprintf("There are %d oranges and %d apples", abs($oranges), abs($apples));

Output: There are 3 oranges and 4 apples

le côté gauche de la déclaration sprintf exprime clairement la chaîne et les types de valeurs attendues, tandis que le côté droit exprime clairement les variables utilisées et la façon dont elles sont manipulées.

3
répondu Ro Mc 2014-03-15 11:57:55

Eh bien, sprintf a de nombreuses capacités comme nous le savons un exemple comme ci-dessous:

il y a quelques mois j'avais besoin de convertir des secondes en format Heure:minute:secondes Comme $t = 494050 //seconds je voulais imprimer comme 137 h 14 m 10 s donc j'ai inventé la fonction php springf() je tiens juste les secondes dans $t et echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60); me donne 137 h 14 m 10 s

fonction sprintf() est très utile si l'on sait comment l'utiliser.

3
répondu Sahed 2014-09-01 11:23:23

L'argument est le même pour l'utilisation des modèles. Vous voudrez séparer vos Textsleev des valeurs variables réelles. En plus des pouvoirs supplémentaires de sprintf dont on parle, c'est juste un truc de style.

2
répondu worenga 2012-06-26 18:45:01

un très bon cas d'utilisation pour l'utilisation de sprintf est la sortie de formats capitonnés de nombres et aussi, lors du mélange de différents types dans une chaîne. Il peut être plus facile à lire dans de nombreux cas et rend très simple à imprimer des représentations différentes de la même variable, en particulier numériques.

2
répondu Lloyd Moore 2012-09-11 22:09:07

utilisant la fonction sprintf() sur la concaténation ordinaire a l'avantage que vous pouvez appliquer différents types de formatage sur les variables à concaténer.

dans votre cas, vous avez

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

et

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

prenons $result = 'passed'; date = '23rd';

en utilisant la concaténation ordinaire vous ne pouvez obtenir la sortie:

Here is the result: passed for this date 23rd

cependant, si vous utilisez sprintf() vous peut obtenir une sortie modifiée telle que:

$output = sprintf('Here is the result: %.4s for this date %.2s',$result,$date);
echo $output;

sortie:

Here is the result: pass for this date 23
2
répondu 2017-07-02 22:24:28