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 voudriez-vous l'utiliser?
Jetez un œil à mon exemple ci-dessous.
Pourquoi utiliser ceci:
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
Lorsque cela fait la même chose et qu'il est plus facile d'écrire IMO:
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
Est-ce que j'ai râté quelque chose?
$output
, tandis que le second est celui-echo
ci.Réponses:
sprintf
possède toutes les capacités de formatage du printf d'origine, ce qui signifie que vous pouvez faire bien plus que simplement insérer des valeurs de variables dans des chaînes.Par exemple, spécifiez le format des nombres (hexadécimal, décimal, octal), le nombre de décimales, le remplissage, etc. Google pour printf et vous trouverez de nombreux exemples. L' article de wikipedia sur printf devrait vous aider à démarrer.
la source
sprintf('%03d', $num)
%,8d
par exemple pour obtenir le nombre entier correctement aligné à 8 chiffres et séparé par des virgules. En utilisantnumber_format
est moins pratique dans unprintf
style.sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');
résultant enHello World, my name is also World.
Il existe de nombreux cas d'utilisation de sprintf, mais une façon de les utiliser est de stocker une chaîne comme celle-ci: "Bonjour, mon nom est% 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 le faire:
Essentiellement, cela permet une certaine séparation dans le code. Si j'utilise «Bonjour, mon nom est% s» à de nombreux endroits dans mon code, je peux le changer en «% s est mon nom» à un endroit et il se met à jour partout ailleurs automatiquement, sans avoir à accéder à chaque instance et à se déplacer concaténations.
la source
Une autre utilisation de
sprintf
est dans les applications localisées comme arguments poursprintf
ne doivent pas nécessairement être dans l'ordre dans ils apparaissent dans la chaîne de format.Exemple:
Mais une langue comme le français ordonne les mots différemment:
(Oui, mon français est nul: j'ai appris l'allemand à l'école!)
En réalité, vous utiliseriez gettext pour stocker les chaînes localisées, mais vous voyez l'idée.
la source
C'est plus facile à traduire.
Les chaînes de traduction (gettext) sont maintenant:
Une fois traduit dans une autre langue, cela peut être impossible ou il en résulte des phrases très étranges.
Maintenant si vous avez
Les chaînes de traduction (gettext) sont maintenant:
Ce qui a beaucoup plus de sens et il est beaucoup plus flexible de traduire dans d'autres langues
la source
echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);
- dire: cela permettrait à une traduction de modifier la phrase commeFor the date %2$s, the result is %1$s
La meilleure raison que j'ai trouvée est que cela vous permet de placer toutes les chaînes de langue dans votre fichier de langue où les gens peuvent les traduire et les commander selon les besoins - mais vous savez toujours que quel que soit le format de la chaîne - vous souhaitez afficher le nom des utilisateurs.
Par exemple, votre site indiquera "Bienvenue à nouveau [[Utilisateur]]" en haut de la page. En tant que programmeur, vous ne savez pas ou souciez pas de la façon dont les gars de l'interface utilisateur vont écrire cela - vous savez simplement qu'un nom d'utilisateur va être affiché quelque part dans un message.
Ainsi, vous pouvez intégrer le message dans votre code sans vous soucier de la nature de ce message.
Fichier Lang (EN_US):
Ensuite, vous pouvez prendre en charge tout type de message dans n'importe quelle langue en l'utilisant dans votre code php actuel.
la source
Cela s'avère très utile lors de l'utilisation d'une source (externe) pour les chaînes de langue. Si vous avez besoin d'un nombre fixe de variables dans une chaîne multilingue donnée, il vous suffit de connaître le bon ordre:
en.txt
hu.txt
Les variables insérées n'ont même pas besoin 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 aucun doute même avec de légères augmentations de performances, mais il est beaucoup plus rapide de simplement (étant donné que vous avez une classe
Language
pour lire les chaînes de langage) :Il est également livré avec toutes les capacités de
printf
, est donc également une ligne unique pour le formatage de nombreux types de variables, par exemple:la source
Comme mentionné, il permet le formatage des données d'entrée. Par exemple, forcer 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 des données qui y sont introduites, presque comme si vous introduisiez des paramètres. Par exemple, dans le cas d'une requête MySQL:
Cette méthode a bien sûr d'autres utilisations, comme lors de l'impression de la sortie au format HTML, etc.
Edit: Pour des raisons de sécurité , lorsque vous utilisez une technique comme ci-dessus, vous devez nettoyer toutes les variables d'entrée avec
mysql_real_escape_string()
avant d'utiliser cette méthode , pour éviter les attaques d'insertion MySQL. Si vous analysez une entrée non autorisée, votre site et votre serveur seront piratés . (À l'exception, bien sûr, des variables qui ont été entièrement construites par votre code et dont la sécurité est garantie.)la source
Utilisation de sprintf () est beaucoup plus propre et plus sûre pour formater votre chaîne.
Par exemple, lorsque vous traitez avec des variables d'entrée, cela évite les surprises inattendues en spécifiant à l'avance le format attendu (par exemple, que vous attendez la chaîne [
%s
] ou le nombre [%d
]). Cela pourrait potentiellement aider avec le risque possible d' injection SQL , mais cela n'empêchera pas si la chaîne se compose de guillemets.Cela aide également à traiter les flottants, vous pouvez spécifier explicitement la précision des chiffres (par exemple
%.2f
) qui vous évite d'utiliser les fonctions de conversion.L'autre avantage est que la plupart des principaux langages de programmation ont leur propre implémentation de
sprintf()
, donc une fois que vous vous êtes familiarisé avec celui-ci, il est encore plus facile à utiliser, plutôt que d'apprendre un nouveau langage (comme comment concaténer des chaînes ou convertir les flottants).En résumé, c'est une bonne pratique à utiliser afin d'avoir un code plus propre et plus lisible.
Par exemple, voyez l' exemple réel ci-dessous :
Ou un exemple simple qui imprime par exemple
'1','2','3','4'
:et impression avec une chaîne formatée:
où
printf()
est équivalent àsprintf()
, mais il génère une chaîne formatée au lieu de la renvoyer (à la variable).Lequel est le plus lisible?
la source
sprintf()
fractionné en plusieurs lignes où la chaîne avec des espaces réservés est sur 1 ligne et les valeurs sont sur une ligne ou même plusieurs lignes en dessous, le tout correctement mis en retrait de cours. En utilisant votre démo de la manière que j'ai décrite ... i.imgur.com/DFi3ur8.pngMême si je pensais la même chose à moins que je ne l'utilise récemment. Lorsque vous générez des documents en fonction des entrées utilisateur, cela sera pratique.
QUI peut être facilement écrit comme
la source
"<p>Some big paragraph {$a['name']} more words {$a['age']}</p>"
. TOUTEFOIS, N'OUBLIEZ PAS de nettoyer les entrées utilisateur ou d'ouvrir votre code aux vulnérabilités XSS.Ce:
Pourrait également être écrit:
À mon avis, c'est plus clair à lire, mais je peux voir l'utilité de la localisation ou du formatage.
la source
Certains des cas typiques sont ceux où vous avez besoin d'un contrôle plus précis sur le format de sortie. Il peut être difficile, par exemple, de s'assurer qu'une valeur spécifique a une quantité spécifique d'espaces remplis à l'avant, en fonction de sa longueur, ou qu'un nombre est sorti dans un format précis spécifique.
Il y a beaucoup d'exemples dans le manuel PHP
Aussi ce qui vient de 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 peut être que vous souhaitez laisser un utilisateur définir le format de sortie d'une certaine valeur - vous pouvez en toute sécurité leur permettre de définir un format de sortie compatible sprintf.
Oh, et votre exemple est en fait faux pour une partie.
sprintf
renvoie la chaîne, maisecho
ne le fait pas - laecho
renvoie immédiatement et ne retourne rien, tandissprintf
que la renvoie simplement.la source
Si vous avez utilisé C / C ++, alors vous seriez habitué à la fonction sprintf.
Il y a de fortes 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 une substitution de jeton de chaîne. Je ne suis pas une personne PHP, mais je soupçonne qu'il y a plus d'objets impliqués dans l'écho. S'il agit comme le ferait Java, il crée une nouvelle chaîne chaque fois que quelque chose est ajouté à la liste, vous vous retrouverez donc avec 4 chaînes créées.
la source
Parfois, j'ai quelque chose comme ça, que je considère un peu plus facile à lire:
la source
J'utilise généralement sprintf pour m'assurer qu'un identifiant provenant de l'entrée utilisateur est un entier par exemple:
Est également utilisé pour faire des modèles rudimentaires (pour les mails html ou autres), afin que vous puissiez réutiliser un modèle dans de nombreux endroits:
Il est également très utile de formater les nombres dans différentes représentations (octal, contrôler la décimale, etc.).
la source
la source
sprintf est particulièrement utile lors du formatage de chaînes utilisant des nombres. Par exemple,
Les oranges sont formatées sous la forme d'un nombre entier (-2), mais s'enrouleront en nombres positifs si l'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:
Le résultat final est une instruction avec une lisibilité élevée, une construction logique, un formatage clair et une 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 évidents. Comme dernier exemple:
Le côté gauche de l'instruction 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 comment elles sont manipulées.
la source
sprintf
PHP, mais ensuite voir ces exemples compliqués créant des fruits de "manquant" fruits :), chacun ne montrant à plusieurs reprises que%d
(etabs()
, ce qui n'est pas pertinent pour le sujet), au lieu de montrer une pléthore d'options de formatage des nombres (ce qui serait pertinent), j'ai changé d'avis. Mais si vous mettez à jour la réponse, j'aurai toujours mon vote positif dans le réfrigérateur pour vous. :) Thx, bravo!Eh bien,
sprintf
a de nombreuses capacités comme nous connaissons un exemple ci-dessous:Il y a quelques mois, j'avais besoin de convertir les secondes en format heure: minute: secondes Comme
$t = 494050 //seconds
je voulais imprimer comme137 h 14 m 10 s
si je suis venu avec la fonction php,springf()
je tiens simplement les secondes$t
etecho sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
me donne137 h 14 m 10 s
sprintf () est très utile si nous savons comment l'utiliser.
la source
L'argument est le même pour l'utilisation des modèles. Vous voudrez séparer votre Textsleev des valeurs de variable réelles. Outre les pouvoirs supplémentaires de sprintf dont nous parlons, c'est juste une question de style.
la source
Un très bon cas d'utilisation de sprintf est la sortie de formats de nombres remplis 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 l'impression de différentes représentations de la même variable, en particulier numériques.
la source
L'utilisation de la fonction sprintf () par rapport à la concaténation ordinaire présente l'avantage de pouvoir appliquer différents types de mise en forme aux variables à concaténer.
Dans votre cas, vous avez
et
Prenons
$result = 'passed'; date = '23rd';
En utilisant la concaténation ordinaire, vous ne pouvez obtenir que la sortie:
Cependant, si vous utilisez,
sprintf()
vous pouvez obtenir une sortie modifiée telle que:Production:
la source
sprintf()
est assez similaire àprintf()
. Si vous savezprintf()
en détails alorssprintf()
et mêmevsprintf()
n'est pas vraiment difficile à comprendre.l' une des choses qui diffère
sprintf()
deprintf()
est que vous aurez besoin de déclarer une variable pour attraper la sortie de la fonction car il n'imprime pas directement / quoi que ce soit d' écho. Voyons les extraits de code suivants:J'espère que cela pourra aider.
la source
L'un «produit», l'autre «retourne», c'est l'une des principales différences.
printf()
Les sortiessprintf()
Retourla source
Vous devez être prudent lorsque vous utilisez sprintf en boucle:
Ce qui conduit aux heures suivantes (sur ma machine locale avec PHP 7.2):
Boucles: 10000000
«$ a. $ b. $ c. $ d. $ e. $ f 'a besoin de 1,4507689476013s
"$ a $ b $ c $ d $ e $ f" nécessite 1,9958319664001s
sprintf ('% s% s% s% s% s% s', $ a, $ b, $ c, $ d, $ e, $ f) a besoin de 9.1771278381348s
la source
Je l'utilise pour les messages aux utilisateurs ou pour d'autres "jolis" types de fonctionnalités. Par exemple, si je sais que je vais utiliser le nom de l'utilisateur.
Et ayez plusieurs messages à utiliser dans cette situation. (C'est-à-dire, bloquer ou suivre un autre utilisateur)
Vous pouvez créer une fonction générale qui fait quelque chose à l'utilisateur et ajouter cette chaîne, et quelle que soit la structure de la phrase, elle devrait être plutôt jolie. Je n'aime toujours pas simplement ajouter des chaînes ensemble et utiliser constamment la notation par points et fermer et rouvrir des chaînes juste pour donner une belle apparence à une phrase. J'étais un fan au début, comme la plupart des autres, mais cela semble assez utile lorsque plusieurs chaînes doivent être manipulées et que vous ne voulez pas coder en dur le placement de la variable à chaque fois.
Pensez-y, qu'est-ce qui a l'air mieux?
Ou
Bien sûr, c'est une étape supplémentaire, mais que se passe-t-il si vos vérifications conditionnelles font un tas d'autres choses fonctionnelles, alors les citations et les ajouts commencent à gêner le codage fonctionnel.
la source