Warum die Sprintf-Funktion in PHP verwenden?

188

Ich versuche mehr über die PHP-Funktion sprintf () zu erfahren, aber php.net hat mir nicht viel geholfen, da ich immer noch verwirrt bin. Warum sollten Sie sie verwenden?

Schauen Sie sich mein Beispiel unten an.

Warum dies verwenden:

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

Wenn dies dasselbe tut und IMO einfacher zu schreiben ist:

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

Vermisse ich hier etwas?

JasonDavis
quelle
40
+1, gute Frage. Ich benutze es selten selbst, deshalb bin ich daran interessiert, die Antworten zu sehen.
Zombat
6
Beachten Sie, dass Ihre beiden Beispiele nicht gleichwertig sind: Das erste weist das Ergebnis einfach zu $output, das zweite echo.
Daniel Pryden
Ich persönlich benutze es, wenn ich viele Dinge verkette. Erst dann finde ich es wirklich nützlich, hauptsächlich für die Lesbarkeit.
AlexMorley-Finch

Antworten:

130

sprintf verfügt über alle Formatierungsfunktionen des Originaldrucks, was bedeutet, dass Sie viel mehr als nur Variablenwerte in Zeichenfolgen einfügen können.

Geben Sie beispielsweise das Zahlenformat (hexadezimal, dezimal, oktal), die Anzahl der Dezimalstellen, den Abstand und mehr an. Google für printf und Sie finden viele Beispiele. Der Wikipedia-Artikel auf printf soll Ihnen den Einstieg erleichtern.

Isak Savo
quelle
46
Vor Jahren habe ich eine nette Funktion für Null-Padding-Zahlen geschrieben. Wird seit Ewigkeiten verwendet, bevor mir klar wird, dass ich es einfach tun kannsprintf('%03d', $num)
DisgruntledGoat
5
PHP sprintf verfügt über alle Formatierungsfunktionen ... es fehlt tatsächlich eine wichtige, %,8dum beispielsweise die richtig ausgerichtete 8-stellige und durch Kommas getrennte Ganzzahl zu erhalten. Die Verwendung number_formatist in einem printfStil weniger bequem .
e2-e4
3
@DisgruntledGoat Können Sie diese Formatierungszeichenfolge ('% 03d') aufschlüsseln? Ich denke es wäre wirklich hilfreich. Vielen Dank.
Herr Smee
3
Sie können die anzuzeigenden Argumente auch wiederholen und neu anordnen. zB sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');resultierend inHello World, my name is also World.
fyrye
77

Es gibt viele Anwendungsfälle für sprintf, aber eine Möglichkeit, sie zu verwenden, besteht darin, eine Zeichenfolge wie die folgende zu speichern: "Hallo, mein Name ist% s" in einer Datenbank oder als Konstante in einer PHP-Klasse. Auf diese Weise kann ich einfach Folgendes tun, wenn ich diesen String verwenden möchte:

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

Im Wesentlichen erlaubt es eine gewisse Trennung im Code. Wenn ich an vielen Stellen in meinem Code "Hallo, mein Name ist% s" verwende, kann ich es an einer Stelle in "% s ist mein Name" ändern und es wird überall automatisch aktualisiert, ohne zu jeder Instanz gehen und sich bewegen zu müssen Verkettungen.

Macinjosh
quelle
8
Dies.
Fügen Sie
46

Eine andere Verwendung von sprintfist in lokalisierten Anwendungen, da die Argumente sprintfnicht in der Reihenfolge vorliegen müssen, in der sie in der Formatzeichenfolge angezeigt werden.

Beispiel:

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

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

Aber eine Sprache wie Französisch ordnet die Wörter anders an:

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

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

(Ja, mein Französisch ist scheiße: Ich habe in der Schule Deutsch gelernt!)

In Wirklichkeit würden Sie gettext verwenden , um die lokalisierten Zeichenfolgen zu speichern, aber Sie haben die Idee.


Ken Keenan
quelle
37

Es ist einfacher zu übersetzen.

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

Übersetzungszeichenfolgen (gettext) sind jetzt:

  • Hier ist das Ergebnis:
  • für dieses Datum

Wenn es in eine andere Sprache übersetzt wird, ist es möglicherweise unmöglich oder es entstehen sehr seltsame Sätze.

Nun, wenn Sie haben

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

Übersetzungszeichenfolgen (gettext) sind jetzt:

  • Hier ist das Ergebnis:% s für dieses Datum% s

Das macht viel mehr Sinn und es ist viel flexibler, in andere Sprachen zu übersetzen

Raspi
quelle
1
Ich sehe, wo dies sehr nützlich wäre +1
JasonDavis
6
Obwohl es für Übersetzungen wahrscheinlich besser wäre, Positionsspezifizierer zu verwenden, um zusätzliche Flexibilität beim Übersetzen zu ermöglichen, dh: echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);For the date %2$s, the result is %1$s
Dies
1
Auch wenn sie nicht in der Originalzeichenfolge vorhanden sind, können Sie sie in die Übersetzung einfügen, und sie funktionieren.
Spektren
17

Der beste Grund, den ich gefunden habe, ist, dass Sie damit alle Sprachzeichenfolgen in Ihre Sprachdatei einfügen können, in die die Benutzer sie nach Bedarf übersetzen und bestellen können. Sie wissen jedoch immer noch, dass Sie die Zeichenfolge unabhängig vom Format anzeigen möchten den Benutzernamen.

Auf Ihrer Website wird beispielsweise oben auf der Seite "Willkommen zurück [[Benutzer]]" angezeigt. Als Programmierer wissen Sie nicht , oder egal , wie die UI Jungs zu schreiben werden , dass - Sie wissen nur , dass ein Benutzer Name irgendwo gezeigt werden in einer Meldung wird.

Sie können die Nachricht also in Ihren Code einbetten, ohne sich Gedanken darüber machen zu müssen, was diese Nachricht tatsächlich ist.

Lang-Datei (EN_US):

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

Dann können Sie jede Art von Nachricht in jeder Sprache unterstützen, indem Sie diese in Ihrem tatsächlichen PHP-Code verwenden.

sprintf($lang['welcome_message'], $user->name())
Xeoncross
quelle
Ich musste mich nie darum kümmern, Sprachdateien zu erstellen, aber dies scheint mir eine der nützlichsten Anwendungen zu sein
JasonDavis
Dieses Beispiel war auch für mich absolut sinnvoll, da ich nicht viele Multilang-Anwendungen durchgeführt habe.
MKN Web Solutions
9

warum willst du es benutzen?

Dies ist sehr nützlich, wenn eine (externe) Quelle für Sprachzeichenfolgen verwendet wird. Wenn Sie eine feste Anzahl von Variablen in einer bestimmten mehrsprachigen Zeichenfolge benötigen, müssen Sie nur die richtige Reihenfolge kennen:

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

Die eingefügten Variablen müssen nicht einmal in mehreren Sprachen am Anfang oder am Ende stehen, sondern nur ihre Reihenfolge.

Natürlich können Sie Ihre eigene Funktion schreiben, um dieses Ersetzen durchzuführen, zweifellos sogar mit einigen geringfügigen Leistungssteigerungen, aber es ist viel schneller, nur (vorausgesetzt, Sie haben eine Klasse Languagezum Lesen von Sprachzeichenfolgen) :

/**
 * 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));

Es verfügt auch über die vollen Funktionen von printfund ist somit auch ein Einzeiler zum Formatieren zahlreicher Arten von Variablen, zum Beispiel:

John Weisz
quelle
8

Wie bereits erwähnt, können die Eingabedaten formatiert werden. Zum Beispiel das Erzwingen von 2DP, 4-stelligen Zahlen usw. Es ist sehr nützlich, um MySQL-Abfragezeichenfolgen zu erstellen.

Ein weiterer Vorteil besteht darin, dass Sie das Layout der Zeichenfolge von den eingespeisten Daten trennen können, fast so, als würden Sie Parameter eingeben. Zum Beispiel im Fall einer MySQL-Abfrage:

// 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);

Diese Methode hat natürlich andere Verwendungszwecke, z. B. beim Drucken der Ausgabe als HTML usw.

Bearbeiten: Wenn Siemysql_real_escape_string() eine Technik wie oben verwenden , müssen Sie aus Sicherheitsgründen alle Eingabevariablen bereinigen, bevor Sie diese Methode verwenden , um MySQL-Einfügungsangriffe zu verhindern. Wenn Sie nicht bereinigte Eingaben analysieren, werden Ihre Site und Ihr Server gehackt . (Mit Ausnahme natürlich von Variablen, die vollständig von Ihrem Code erstellt wurden und garantiert sicher sind.)

Samuel Jaeschke
quelle
2
Dieser Code ist anfällig für SQL-Injection. Verwenden Sie Platzhalter, keine Abfrageinterpolation!
Abenddämmerung -inaktiv-
@duskwuff - Verwendet wie es ist, hast du recht. Entschuldigung, ich habe meine Antwort geändert.
Samuel Jaeschke
7

Die Verwendung von sprintf () ist viel sauberer und sicherer beim Formatieren Ihrer Zeichenfolge.

Wenn Sie beispielsweise mit Eingabevariablen arbeiten, werden unerwartete Überraschungen verhindert, indem Sie das erwartete Format im Voraus angeben (z. B. dass Sie Zeichenfolge [ %s] oder die Zahl [ %d] erwarten ). Dies könnte möglicherweise das mögliche Risiko einer SQL-Injection erhöhen , verhindert jedoch nicht, dass Zeichenfolgen aus Anführungszeichen bestehen.

Es hilft auch beim Umgang mit Floats. Sie können die Zifferngenauigkeit (z. B. %.2f) explizit angeben, um die Verwendung von Konvertierungsfunktionen zu vermeiden.

Der andere Vorteil ist, dass die meisten wichtigen Programmiersprachen eine eigene Implementierung sprintf()haben. Sobald Sie sich damit vertraut gemacht haben, ist die Verwendung noch einfacher, als das Erlernen einer neuen Sprache (z. B. das Verketten von Zeichenfolgen oder das Konvertieren der Floats).

Zusammenfassend ist es eine gute Praxis, einen saubereren und besser lesbaren Code zu erhalten.

Siehe zum Beispiel das folgende reale Beispiel :

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

Oder ein einfaches Beispiel, das zB druckt '1','2','3','4':

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

und Drucken mit formatierter Zeichenfolge:

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

Dabei printf()entspricht sprintf()es, gibt jedoch eine formatierte Zeichenfolge aus, anstatt sie (an die Variable) zurückzugeben.

Welches ist besser lesbar?

Kenorb
quelle
1
Ich bin nicht anderer Meinung, aber auch erwähnenswert, dass ich dies vor 6-7 Jahren gefragt habe und zurückdenke, ich kann mich nicht erinnern, dass ich dies seitdem verwendet habe! Ich hoffe, eines Tages einen Platz dafür zu finden und glaube, dass es einen Platz hat, aber lustig zu denken, dass ich ihn nicht benutzt habe, seit ich diese Frage vor so vielen Jahren gestellt habe!
JasonDavis
Ich kann sagen, dass es dem Festlegen von Variablen für PDO in PHP etwas ähnlich ist. Auch wenn Sie ihm das Lesbarkeitsargument geben möchten, bevorzuge ich in diesem Fall die sprintf()Aufteilung in mehrere Zeilen, wobei sich die Zeichenfolge mit Platzhaltern in einer Zeile befindet und die Werte in einer Zeile oder sogar mehreren Zeilen darunter stehen, wobei alle korrekt eingerückt sind Kurs. Verwenden Sie Ihre Demo in der von mir beschriebenen Weise ... i.imgur.com/DFi3ur8.png
JasonDavis
Vorbereitete Anweisungen in Verbindung mit gespeicherten Prozeduren sind der beste Weg, um SQL-Injection zu verhindern, nicht Sprintf. Sie können immer noch problemlos SQL-Sprints mit sprintf einfügen, wenn die Zeichenfolge zufällig ein einfaches Anführungszeichen enthält
HumbleWebDev
4

Auch wenn ich das gleiche denke, es sei denn, ich habe es kürzlich benutzt. Wenn Sie Dokumente basierend auf Benutzereingaben generieren, ist dies praktisch.

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

Was leicht geschrieben werden kann als

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);
Schwertfisch
quelle
Oder Sie können dies tun : "<p>Some big paragraph {$a['name']} more words {$a['age']}</p>". VERGESSEN SIE JEDOCH NICHT, Benutzereingaben zu bereinigen, oder öffnen Sie Ihren Code für XSS-Schwachstellen.
Thirdender
Sie können auch die HEREDOC-Syntax verwenden . Meiner Meinung nach sind beide leichter zu lesen als die Sprintf-Syntax.
Thirdender
4

Dies:

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

Könnte auch geschrieben werden:

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

Meiner Meinung nach ist dies klarer zu lesen, aber ich kann die Verwendung für die Lokalisierung oder Formatierung erkennen.

Thomas Tremain
quelle
3

In einigen typischen Fällen müssen Sie das Ausgabeformat genauer steuern. Es kann beispielsweise schwierig sein, sicherzustellen, dass für einen bestimmten Wert je nach Länge eine bestimmte Anzahl von Leerzeichen nach vorne aufgefüllt ist oder dass eine Zahl in einem bestimmten genauen Format ausgegeben wird.

Es gibt viele Beispiele im PHP-Handbuch

Auch was kommt zu Ihrem Beispiel von "einfacher zu schreiben". Während das Echo möglicherweise einfacher zu schreiben ist, ist der Sprintf leichter zu lesen, insbesondere wenn Sie viele Variablen haben.

Ein weiterer Grund für die Verwendung von sprintf oder printf könnte sein, dass Sie einem Benutzer erlauben möchten, das Ausgabeformat eines bestimmten Werts zu definieren. Sie können ihm sicher erlauben, ein sprintf-kompatibles Ausgabeformat zu definieren.

Oh, und Ihr Beispiel ist tatsächlich für einen Teil falsch. sprintfGibt den String zurück, gibt ihn aber echonicht aus - echogibt ihn sofort aus und gibt nichts zurück, während er sprintfnur zurückgegeben wird.

Jani Hartikainen
quelle
3
  1. Wenn Sie C / C ++ verwendet haben, sind Sie an die Sprintf-Funktion gewöhnt.

  2. Es besteht eine gute Chance, dass die zweite Zeile weniger effizient ist. Echo ist als Ausgabebefehl konzipiert, während sprintf für die Ersetzung von Zeichenfolgentoken ausgelegt ist. Ich bin keine PHP-Person, aber ich vermute, dass mehr Objekte mit dem Echo verbunden sind. Wenn es sich wie Java verhält, wird jedes Mal, wenn etwas zur Liste hinzugefügt wird, eine neue Zeichenfolge erstellt, sodass am Ende 4 Zeichenfolgen erstellt werden.

Paul
quelle
Neuere Java-Editionen konvertieren die String-Verkettung hinter den Kulissen in einen StringBuilder.
RodeoClown
1
Strings in PHP sind keine Objekte. Das zweite Beispiel verwendet ein Sprachkonstrukt anstelle eines Funktionsaufrufs und ist daher unmerklich schneller.
Tamlyn
3

Manchmal habe ich so etwas, was ich für etwas einfacher zu lesen halte:

$fileName = sprintf('thumb_%s.%s', 
                    $fileId,
                    $fileInfo['extension']);
Schraubstock
quelle
3

Normalerweise verwende ich sprintf, um sicherzustellen, dass eine ID, die aus der Benutzereingabe stammt, eine Ganzzahl ist, zum Beispiel:

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

Wird auch verwendet, um rudimentäre Vorlagen (für HTML-Mails oder andere Dinge) zu erstellen, sodass Sie die Vorlage an vielen Stellen wiederverwenden können:

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

Es ist auch sehr nützlich, Zahlen in verschiedenen Darstellungen zu formatieren (Oktal, Dezimalstelle steuern usw.).

Castro
quelle
Ist es nicht einfacher, nur intval ($ _ GET ["article_id"]) zu verwenden? Nun, eigentlich dauerte es mehr zu tippen ... * notiert Ihre Methode "Dag nabbit.
user97410
Verwenden Sie für diesen Codetyp besser den integrierten mysql_real_escape_string (): $ query = sprintf ("SELECT * aus Artikeln mit id =% d;", ​​mysql_real_escape_string ($ _ GET ['article_id']);
bruno.braga
3
define('TEXT_MESSAGE', 'The variable "%s" is in the middle!');

sprintf(TEXT_MESSAGE, "Var1");
sprintf(TEXT_MESSAGE, "Var2");
sprintf(TEXT_MESSAGE, "Var3");
Mee
quelle
3

sprintf ist besonders nützlich, wenn Zeichenfolgen formatiert werden, die Zahlen verwenden. Beispielsweise,

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

Output: There are -2 oranges in the basket

Orangen sind als ganze Zahl (-2) formatiert, werden jedoch in positive Zahlen umgewandelt, wenn% u für vorzeichenlose Werte verwendet wird. Um dieses Verhalten zu vermeiden, verwende ich die absolute Funktion abs (), um die Zahl wie folgt auf Null zu runden:

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

Output: There are 5 oranges in the basket

Das Endergebnis ist eine Anweisung mit hoher Lesbarkeit, logischer Konstruktion, klarer Formatierung und Flexibilität für das Hinzufügen zusätzlicher Variablen nach Bedarf. Wenn die Anzahl der Variablen in Kombination mit Funktionen, die diese Variablen manipulieren, zunimmt, werden die Vorteile deutlicher. Als letztes Beispiel:

$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

Die linke Seite der sprintf-Anweisung drückt die Zeichenfolge und die Arten der erwarteten Werte klar aus, während die rechte Seite die verwendeten Variablen und ihre Manipulation klar ausdrückt.

Ro Mc
quelle
Ich wollte Ihre Antwort für den hervorragenden ersten Satz ( "sprintf ist besonders nützlich beim Formatieren von Zeichenfolgen, die Zahlen verwenden" ) positiv bewerten , was in der Tat der wichtigste Punkt sprintfin PHP ist, aber dann diese verschlungenen Beispiele sehen, die Früchte aus "fehlenden" erstellen. Früchte :), die jeweils nur wiederholt angezeigt werden %d(und abs(), was für das Thema irrelevant ist), anstatt einige der zahlreichen Optionen zur Formatierung von Zahlen anzuzeigen (die relevant wären ), habe ich meine Meinung geändert. Aber wenn Sie die Antwort aktualisieren, habe ich meine Gegenstimme immer noch für Sie im Kühlschrank. :) Danke, Prost!
Gr.
3

Nun, sprintf hat viele Funktionen, wie wir ein Beispiel wie folgt kennen:

Vor ein paar Monaten musste ich das Format Sekunden in Stunde: Minute: Sekunden konvertieren. Als $t = 494050 //secondsich so drucken wollte, 137 h 14 m 10 skam ich auf die PHP-Funktion. springf()Ich halte nur die Sekunden in $tund echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);gebe mir137 h 14 m 10 s

Die Funktion sprintf () ist sehr nützlich, wenn wir wissen, wie man sie benutzt.

Sahed
quelle
2

Das Argument ist das gleiche für die Verwendung von Vorlagen. Sie möchten Ihren Textsleev von den tatsächlichen Variablenwerten trennen. Abgesehen von den zusätzlichen Sprintf-Fähigkeiten, die wir erwähnt haben, ist es nur eine Stilsache.

worenga
quelle
2

Ein wirklich guter Anwendungsfall für die Verwendung von sprintf ist die Ausgabe aufgefüllter Zahlenformate und auch beim Mischen verschiedener Typen in einer Zeichenfolge. In vielen Fällen ist es einfacher zu lesen und es ist sehr einfach, verschiedene Darstellungen derselben Variablen zu drucken, insbesondere numerische.

Lloyd Moore
quelle
2

Die Verwendung der Funktion sprintf () gegenüber der normalen Verkettung hat den Vorteil, dass Sie verschiedene Arten der Formatierung auf die zu verkettenden Variablen anwenden können.

In Ihrem Fall haben Sie

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

und

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

Lass uns nehmen $result = 'passed'; date = '23rd';

Bei normaler Verkettung können Sie nur die Ausgabe erhalten:

Here is the result: passed for this date 23rd

Wenn Sie jedoch verwenden sprintf(), können Sie eine geänderte Ausgabe erhalten, wie z.

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

Ausgabe:

Here is the result: pass for this date 23

quelle
2

sprintf()ist ziemlich ähnlich zu printf(). Wenn Sie printf()im Detail wissen, dann sprintf()und sogar vsprintf()ist nicht wirklich schwer zu verstehen.

eines der Dinge , die unterscheidet sich sprintf()von printf()ist , dass Sie eine Variable deklarieren müssen die Ausgabe von der Funktion zu fangen , da sie nicht direkt drucken / echo etwas. Sehen Sie sich die folgenden Codefragmente an:

printf("Hello %s", "world"); // "Hello world"

sprintf("Hello %s", "world"); // does not display anything

echo sprintf("Hello %s", "world"); // "Hello world"

$a = sprintf("Hello %s", "world"); // does not display anything

echo $a;// "Hello world"

Hoffentlich hilft das.

Vuong
quelle
1

Eine "Ausgabe", die andere "Rückkehr", das ist einer der Hauptunterschiede.

printf() Ausgänge

sprintf() Kehrt zurück

Mohd Abdul Mujib
quelle
0

Sie müssen vorsichtig sein, wenn Sie sprintf in Schleifen verwenden:

$a = 'Anton';
$b = 'Bert';
$c = 'Corni';
$d = 'Dora';
$e = 'Emiel';
$f = 'Falk';
$loops = 10000000;

$time = microtime(true);

for ($i = 0; $i < $loops; $i++)
{
    $test = $a . $b . $c . $d . $e . $f;
}

$concatTime = microtime(true) - $time;

$time = microtime(true);

for ($i = 0; $i < $loops; $i++)
{
    $test = "$a $b $c $d $e $f";
}

$concat2Time = microtime(true) - $time;

$time = microtime(true);

for ($i = 0; $i < $loops; $i++)
{
    $test = sprintf('%s %s %s %s %s %s', $a, $b, $c, $d, $e, $f);
}

$sprintfTime = microtime(true) - $time;

echo 'Loops: ' . $loops . '<br>';
echo '\'$a . $b . $c . $d . $e . $f\'' . ' needs ' . $concatTime  . 's<br>';
echo '"$a $b $c $d $e $f"' . ' needs ' . $concat2Time  . 's<br>';
echo 'sprintf(\'%s %s %s %s %s %s\', $a, $b, $c, $d, $e, $f)' . ' needs ' . $sprintfTime  . 's<br>';

Was zu folgenden Zeiten führt (auf meinem lokalen Computer mit PHP 7.2):

Schleifen: 10000000

'$ a. $ b. $ c. $ d. $ e. $ f 'benötigt 1.4507689476013s

"$ a $ b $ c $ d $ e $ f" benötigt 1.9958319664001s

sprintf ('% s% s% s% s% s% s', $ a, $ b, $ c, $ d, $ e, $ f) benötigt 9.1771278381348s

g3rdn
quelle
0

Ich benutze es für Nachrichten an Benutzer oder andere "hübsche" Arten von Funktionen. Wenn ich zum Beispiel weiß, dass ich den Namen des Benutzers verwenden werde.

$name = 'Some dynamic name';

In dieser Situation können mehrere Nachrichten verwendet werden. (Dh einen anderen Benutzer blockieren oder ihm folgen)

$messageBlock = 'You have blocked %s from accessing you.';
$messageFollow = 'Following %s is a great idea!';

Sie können eine allgemeine Funktion erstellen, die dem Benutzer etwas antut, und diese Zeichenfolge hinzufügen. Unabhängig von der Struktur des Satzes sollte sie ziemlich gut aussehen. Ich mag es immer nicht, nur Strings zusammenzufügen und ständig Punktnotation zu verwenden und Strings zu schließen und wieder zu öffnen, nur um einen Satz gut aussehen zu lassen. Anfangs war ich wie die meisten ein Fan, aber dies scheint ziemlich nützlich zu sein, wenn mehrere Zeichenfolgen manipuliert werden müssen und Sie die Platzierung der Variablen nicht jedes Mal hart codieren möchten.

Denken Sie daran, was sieht besser aus?

return $messageOne === true ? $name.'. Please use the next example' : 'Hi '.$name.', how are you?'

Oder

$message = $messageOne === true ? 'Option one %s' 
: ($messageTwo === true ? 'Option Two %s maybe?' : '%s you can choose from tons of grammatical instances and not have to edit variable placement and strings');

return sprintf($message, $name);

Sicher, es ist ein zusätzlicher Schritt, aber was ist, wenn Ihre bedingten Überprüfungen eine Reihe anderer funktionaler Dinge tun, dann beginnen die Zitate und Anhänge, die Codierung funktional zu behindern.

Douglas Richardson
quelle