Pourquoi utiliser la fonction sprintf en PHP?



Answers

Il y a beaucoup de cas d'utilisation pour sprintf mais une façon de les utiliser est de stocker une chaîne comme ceci: 'Bonjour, Mon nom est% s' dans une base de données ou comme une constante dans une classe PHP. De cette façon, quand 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 'Bonjour, Mon nom est% s' dans beaucoup d'endroits dans mon code, je peux le changer en '% s est mon nom' et le mettre à jour partout ailleurs automagiquement, sans devoir aller à chaque instance et se déplacer concaténations.

Question

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?

Jetez un oeil à 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 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?




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

Par exemple, lorsque vous traitez des variables d'entrée, cela évite 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 un risque possible d' injection SQL , mais cela n'empêchera pas de faire des citations de chaîne.

Cela aide également à gérer les flottants, vous pouvez spécifier explicitement la précision des chiffres (par exemple %.2f ), ce qui vous évite d'utiliser les 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 concaténer des chaînes ou convertir le flotteurs).

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

Par exemple, voir l' exemple réel ci-dessous:

$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 une chaîne formatée:

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

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

Lequel est le plus lisible?




L'argument est le même pour l'utilisation de modèles. Vous voudrez séparer votre Textsleev des valeurs variables réelles. Outre les pouvoirs supplémentaires de sprintf dont nous parlons, c'est juste un style.




Ce:

"<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.";

Peut aussi être écrit:

"<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 le formatage.




L'utilisation de la fonction sprintf () par rapport à la concaténation ordinaire présente l'avantage de pouvoir appliquer différents types de formatage aux 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'; $result = 'passed'; date = '23rd';

En utilisant la concaténation ordinaire, vous pouvez seulement obtenir la sortie:

Here is the result: passed for this date 23rd

Cependant, si vous utilisez sprintf() vous pouvez 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



sprintf est particulièrement utile lors du formatage de chaînes utilisant 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é sous la forme d'un nombre entier (-2), mais sera arrondi aux 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:

$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 une déclaration 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 apparents. En 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 comment elles sont manipulées.




  1. Si vous avez utilisé C / C ++, vous seriez habitué à la fonction sprintf.

  2. Il y a de fortes chances que la deuxième ligne soit moins efficace. Echo est conçu comme une commande de sortie, alors que sprintf est conçu pour effectuer une substitution de jeton de chaîne. Je ne suis pas une personne PHP, mais je pense qu'il y a plus d'objets impliqués dans l'écho. S'il agit comme Java le ferait, il crée une nouvelle chaîne à chaque fois que quelque chose est ajouté à la liste, donc vous auriez 4 chaînes créées.




J'utilise généralement sprintf pour m'assurer qu'un identifiant provenant 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 modèles rudimentaires (pour les mails html ou autres), ainsi vous pouvez réutiliser le modèle dans de nombreux endroits:

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

Il est également très utile de formater des nombres dans différentes représentations (octales, contrôle de la décimale, etc.).




Comme mentionné, il permet le formatage des données d'entrée. Par exemple, forcer 2dp, 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 utilisiez des paramètres. 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 en 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 empêcher les attaques par insertion de MySQL. Si vous analysez les entrées non gérées, votre site et votre serveur seront piratés . (À l'exception, bien entendu, des variables qui ont été entièrement construites par votre code et qui sont sûres d'être sécurisées.)




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

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

Maintenant si vous avez

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

Translation (gettext) strings est maintenant:

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

Ce qui a beaucoup plus de sens et il est beaucoup plus flexible de traduire vers d'autres langues




Links



Tags

php php   printf