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?
$output
, das zweiteecho
.Antworten:
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.
quelle
sprintf('%03d', $num)
%,8d
um beispielsweise die richtig ausgerichtete 8-stellige und durch Kommas getrennte Ganzzahl zu erhalten. Die Verwendungnumber_format
ist in einemprintf
Stil weniger bequem .sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');
resultierend inHello World, my name is also World.
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:
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.
quelle
Eine andere Verwendung von
sprintf
ist in lokalisierten Anwendungen, da die Argumentesprintf
nicht in der Reihenfolge vorliegen müssen, in der sie in der Formatzeichenfolge angezeigt werden.Beispiel:
Aber eine Sprache wie Französisch ordnet die Wörter anders an:
(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.
quelle
Es ist einfacher zu übersetzen.
Übersetzungszeichenfolgen (gettext) sind jetzt:
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
Übersetzungszeichenfolgen (gettext) sind jetzt:
Das macht viel mehr Sinn und es ist viel flexibler, in andere Sprachen zu übersetzen
quelle
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
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):
Dann können Sie jede Art von Nachricht in jeder Sprache unterstützen, indem Sie diese in Ihrem tatsächlichen PHP-Code verwenden.
quelle
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
hu.txt
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
Language
zum Lesen von Sprachzeichenfolgen) :Es verfügt auch über die vollen Funktionen von
printf
und ist somit auch ein Einzeiler zum Formatieren zahlreicher Arten von Variablen, zum Beispiel:quelle
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:
Diese Methode hat natürlich andere Verwendungszwecke, z. B. beim Drucken der Ausgabe als HTML usw.
Bearbeiten: Wenn Sie
mysql_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.)quelle
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 :
Oder ein einfaches Beispiel, das zB druckt
'1','2','3','4'
:und Drucken mit formatierter Zeichenfolge:
Dabei
printf()
entsprichtsprintf()
es, gibt jedoch eine formatierte Zeichenfolge aus, anstatt sie (an die Variable) zurückzugeben.Welches ist besser lesbar?
quelle
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.pngAuch wenn ich das gleiche denke, es sei denn, ich habe es kürzlich benutzt. Wenn Sie Dokumente basierend auf Benutzereingaben generieren, ist dies praktisch.
Was leicht geschrieben werden kann als
quelle
"<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.Dies:
Könnte auch geschrieben werden:
Meiner Meinung nach ist dies klarer zu lesen, aber ich kann die Verwendung für die Lokalisierung oder Formatierung erkennen.
quelle
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.
sprintf
Gibt den String zurück, gibt ihn aberecho
nicht aus -echo
gibt ihn sofort aus und gibt nichts zurück, während ersprintf
nur zurückgegeben wird.quelle
Wenn Sie C / C ++ verwendet haben, sind Sie an die Sprintf-Funktion gewöhnt.
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.
quelle
Manchmal habe ich so etwas, was ich für etwas einfacher zu lesen halte:
quelle
Normalerweise verwende ich sprintf, um sicherzustellen, dass eine ID, die aus der Benutzereingabe stammt, eine Ganzzahl ist, zum Beispiel:
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:
Es ist auch sehr nützlich, Zahlen in verschiedenen Darstellungen zu formatieren (Oktal, Dezimalstelle steuern usw.).
quelle
quelle
sprintf ist besonders nützlich, wenn Zeichenfolgen formatiert werden, die Zahlen verwenden. Beispielsweise,
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:
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:
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.
quelle
sprintf
in PHP ist, aber dann diese verschlungenen Beispiele sehen, die Früchte aus "fehlenden" erstellen. Früchte :), die jeweils nur wiederholt angezeigt werden%d
(undabs()
, 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!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 //seconds
ich so drucken wollte,137 h 14 m 10 s
kam ich auf die PHP-Funktion.springf()
Ich halte nur die Sekunden in$t
undecho 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.
quelle
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.
quelle
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.
quelle
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
und
Lass uns nehmen
$result = 'passed'; date = '23rd';
Bei normaler Verkettung können Sie nur die Ausgabe erhalten:
Wenn Sie jedoch verwenden
sprintf()
, können Sie eine geänderte Ausgabe erhalten, wie z.Ausgabe:
quelle
sprintf()
ist ziemlich ähnlich zuprintf()
. Wenn Sieprintf()
im Detail wissen, dannsprintf()
und sogarvsprintf()
ist nicht wirklich schwer zu verstehen.eines der Dinge , die unterscheidet sich
sprintf()
vonprintf()
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:Hoffentlich hilft das.
quelle
Eine "Ausgabe", die andere "Rückkehr", das ist einer der Hauptunterschiede.
printf()
Ausgängesprintf()
Kehrt zurückquelle
Sie müssen vorsichtig sein, wenn Sie sprintf in Schleifen verwenden:
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
quelle
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.
In dieser Situation können mehrere Nachrichten verwendet werden. (Dh einen anderen Benutzer blockieren oder ihm folgen)
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?
Oder
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.
quelle