sprintf

Kombinieren von Zeichenfolgenliteralen und Variablen in PHP

In PHP haben wir mehrere Möglichkeiten, Strings anzugeben, aber die meisten von uns sind nur mit der Definition von Zeichenfolgen-Literalen mit Anführungszeichen vertraut. Manchmal sind diese Strings einfach und wir können sie unverändert verwenden, aber häufiger müssen sie dynamisch sein und mit verschiedenen Variablen kombiniert werden.

Es ist wichtig, ein gutes Verständnis dafür zu haben, wie Sie Zeichenfolgen-Literale mit beliebigen Variablen kombinieren können.

Die gebräuchlichsten Ansätze zur Anpassung eines Strings sind die Verwendung von:

  1. Einzelne Anführungszeichen mit Verkettung,
  2. Doppelte Anführungszeichen mit In-String-Variable,
  3. sprintf (vsprintf) Funktion,
  4. heredoc (newdoc) Syntax.

Wir werden uns auf jede Option konzentrieren, ihre Stärken und Schwächen. Zuerst tauchen wir in die Theorie ein.

Theorie

#1 Einzelne Anführungszeichen mit Verkettung

Ein String mit einfachen Anführungszeichen interpretiert keine Variablen darin. Im Gegensatz zu den anderen Optionen werden Variablen in einem String mit einfachen Anführungszeichen nicht erweitert, wenn sie auftreten. Das bedeutet, dass Sie die Verkettung verwenden müssen.

'Variable ist ' . $var; 

#2 Doppelte Anführungszeichen und In-String-Variable

Mit doppelten Anführungszeichen erweitert der PHP-Compiler jede entkommene Variable innerhalb eines Zeichenfolgen-Literals.

"Variable ist {$var}"; 

#3 Sprintf (vsprintf) Funktion

Sprintf ist die leistungsfähigste und fortschrittlichste PHP-String-Formatierungsfunktion, die Ihnen viele Möglichkeiten zur Steuerung des Endergebnisses bietet. Sie ermöglicht es Ihnen, Strings entsprechend einer speziellen Templatesprache zu formatieren und scheint eine weitaus leistungsfähigere Möglichkeit zu sein, Variablen in ihnen einzufügen, allerdings mit den höchsten Verarbeitungskosten.

Die Sprintf-Funktion nimmt das String-Template als erstes Argument. Danach kann es eine unbegrenzte Anzahl von Argumenten geben. Sprintf ersetzt Platzhalter innerhalb eines Strings gemäß den Argumenten, die Sie an die Funktion übergeben haben.

sprintf('Variable ist %s', $var); 

#4 Heredoc (und nowdoc)

Ein Here Document wird als ein Teil einer Quellcodedatei definiert, der so behandelt wird, als wäre er eine separate Datei.

Die verbesserte Syntax (seit PHP 7.3) ermöglicht es uns, heredoc auf eine lesbarere, viel sauberere und weniger fehleranfällige Weise zu verwenden. Heredoc ermöglicht es Ihnen, etwas zu tun, das mit einem Zeichenfolgen-Literal schwieriger ist. Es ermöglicht Ihnen, einen Textblock als Literal zu definieren.

Standardmäßig verarbeitet PHP ein heredoc, als wäre es ein String-Literal mit doppelten Anführungszeichen, während nowdoc - ein einzeln zitierter String ist. Um einen nowdoc zu verwenden, müssen wir einfach den öffnenden Bezeichner in einfache Anführungszeichen einschließen.

Heredoc-Syntax:

$str = <<<STR
Variable ist $var
STR;

Newdoc-Syntax:

$str = <<<'STR'
Variable ist $var
STR;

Praxis

Lassen Sie uns jeden Ansatz mit einigen Beispielen testen.

Betrachten Sie den folgenden Text:

Klopf klopf, "LANG" hat Sie. Wachen Sie auf NAME, ACTION

#1 Verkettung 

$str = 'Klopf klopf, "' . $lang . '" hat Sie. Wachen Sie auf ' . $name . ', ' . $action;

Wir müssen hier mit einer Vielzahl von Anführungszeichen, Verkettungen und zusätzlichen Leerzeichen umgehen.

#2 In-String-Variable

$str = "Klopf klopf, \"{$lang}\" hat Sie. Wachen Sie auf {$name}, {$action}";

Sieht viel besser aus, denken Sie nur daran, Variablen und Sonderzeichen (in diesem Fall „) zu maskieren.

#3 Sprintf

$str = sprintf('Klopf klopf, "%s" hat Sie. Wachen Sie auf %s, %s', $lang, $name, $action);

Sieht auch ziemlich lesbar aus, ohne Maskierung.

Alternativ können wir die Variablen als ein Array übergeben.

$vars = [
 'PHP',
 'Entwickler',
 'Zeit zu programmieren'
];
$str = sprintf('Klopf klopf, "%s" hat Sie. Wachen Sie auf %s, %s', ...$vars);

Gleiches gilt, wenn wir die vsprintf-Funktion verwenden.

$str = vsprintf('Klopf klopf, "%s" hat Sie. Wachen Sie auf %s, %s', $vars);

#4 Heredoc

$str = <<<STR
Klopf klopf, "$lang" hat Sie. Wachen Sie auf $name, $action
STR;

Keine Maskierung, keine Verkettungen oder zusätzlichen Anführungszeichen, keine Notwendigkeit, Funktionen aufzurufen, aber 3 Zeilen für einen einfachen String. 

Angenommen, wir möchten einige Markup mit dynamischen Variablen hinzufügen:

<div class="container">
 <p style="font-size:SIZEpx;line-height:SIZEpx;">
   <span class="first-item" style="color:red">TEXT1</span>
   <span class="last-item" style="color:black">TEXT2/span>
 </p>
</div>

Wir würden hier heredoc empfehlen:

<<<TEXT
<div class="container">
 <p style="font-size:{$size}px;line-height:{$size}px;">
   <span class="first-item" style="color:red">$text1</span>
   <span class="last-item" style="color:black">$text2</span>
 </p>
</div>
TEXT;

In-string sieht ähnlich aus, aber wir benötigen etwas mehr Escape-Zeichen ‘\’ und {}.

"<div class=\"container\">
 <p style=\"font-size:{$size}px;line-height:{$size}px;\">
   <span class=\"first-item\" style=\"color:red\">{$text1}</span>
   <span class=\"last-item\"  style=\"color:black\">{$text2}</span>
 </p>
</div>";

Verkettung sieht weniger lesbar aus, aber dank des Formats ist es nicht störend. Aber das ist nicht das Hauptproblem hier:

'<div class="container">
<p style="font-size:' . $size . 'px;line-height:' . $size . 'px;">
<span class="first-item" style="color:red">' . $text1 . '</span>
<span class="last-item"  style="color:black">' . $text2 . '</span>
</p></div>';

Stellen Sie sich vor, wir möchten eine neue dynamische Variable zum <p> Tag hinzufügen, in heredoc Syntax:

display: $display;

oder im doppelt zitierten Fall:

display: {$display};

Während wir für einen einfach zitierten Fall den richtigen Platz finden müssen, bevor wir weitere Verkettungen und Anführungszeichen hinzufügen. Es ist sehr einfach, einen Fehler zu machen:

display:' . $display . ';">' . '

Und was ist mit sprintf:

sprintf('<div class="container">
<p style="font-size:%spx;line-height:%spx;">
  <span class="first-item" style="color:red">%s</span>
  <span class="last-item" style="color:black">%s</span>
</p>
</div>', $size, $size, $text1, $text2);

Das Übergeben eines mehrzeiligen Strings sieht nicht großartig aus, es sei denn, Sie möchten es zunächst einer Variablen zuweisen. 

Denken Sie auch daran, die Anzahl der Variablen-Platzhalter gering zu halten. Andernfalls haben Sie einen Wartungsalbtraum mit 10+ Parametern, versuchen, neue %s hinzuzufügen, die Position in der Parameterliste zu finden und sie zum sprintf-Aufruf hinzuzufügen. 

Im obigen Beispiel, wenn wir eine neue Variable hinzufügen möchten

display: %s;

direkt nach der Zeilenhöhe müssen wir herausfinden, dass es sich um den dritten Parameter handelt, und ihn als Argument zwischen $size und $text1 auflisten. Klingt nicht cool.
In diesem Fall können Sie versuchen, mit geordneten Platzhaltern wie %1$s, %2$s zu spielen, außerdem können diese Platzhalter wiederholt werden, ohne dass mehr Argumente im Code hinzugefügt werden müssen.

sprintf('<div class="container">
<p style="font-size:%1$spx;line-height:%1$spx;display:%4$s">
  <span class="first-item" style="color:red">%2$s</span>
  <span class="last-item" style="color:black">%3$s</span>
</p>
</div>', $size, $text1, $text2, $display);

Leistungsvergleich

Die anfängliche Einrichtung unseres Tests:

  • PHP 7.3
  • Anzahl der Iterationen - 5.000.000
  • Der einfache Fall ist Klopf klopf, $lang hat Sie.
  • Der komplizierte ist Klopf klopf, "$lang" hat Sie. Wachen Sie auf $name, $action

Die Ergebnisse:

 Einfaches AnführungszeichenDoppeltes AnführungszeichenSprintfSprintf (alt)Heredoc
einfacher Fall, ms275259533572260
komplizierter Fall, ms685479935888487

Zeichenfolgen- und Variablen-Diagramm

MYTHOS: Die Verwendung von “ ist schneller als ‘. PHP verwendet keine zusätzliche Verarbeitung, um zu interpretieren, was sich innerhalb des einfachen Anführungszeichens befindet, während es innerhalb doppelter Anführungszeichen PHP analysieren und prüfen muss, ob es Variablen gibt.

Heute hält das Argument, dass eines besser funktioniert als das andere, nicht stand, es sei denn, Sie beginnen, die Zeichenfolge mit Variablen zu kombinieren, dann ist die Methode mit doppelten Anführungszeichen hier definitiv ein Gewinner.

Zusammenfassung

Wir finden die Option In-String die am meisten nutzbare Methode, um die Strings und Variablen zu kombinieren. Die allgemeine Empfehlung ist jedoch, jede Methode für ein bestimmtes Szenario zu verwenden. 

Hier sind die Empfehlungen für jeden Ansatz:

  1. Verwenden Sie einzelne Anführungszeichen standardmäßig, es sei denn, Sie müssen Variablen innerhalb des Strings verwenden. Andernfalls bekommen Sie ein Wartungschaos, das mit der Komplexität der Strings zunimmt, da Sie mit einer Vielzahl von Anführungszeichen, Verkettungen und zusätzlichen Leerzeichen umgehen müssen. Dasselbe gilt für die Leistung: der String mit mehr Verkettungen ist weniger effizient gegenüber #2 und #3.
  2. Doppelt zitierte Strings sind eleganter, weil Sie Ihren String nicht jedes Mal unterbrechen müssen, wenn Sie eine Variable einfügen müssen (wie Sie es bei einfach zitierten Strings tun müssen). Dadurch wird das Schreiben und Lesen solcher Strings erleichtert. Auch ist es einer der schnellsten Ansätze, besonders in schwierigen Szenarien.
  3. Heredoc verhält sich wie ein doppelt zitierter String, der möglicherweise auch für Sie die Option ist. Sowohl heredoc als auch nowdoc Syntaxen sind sehr nützlich, wenn wir einen mehrzeiligen String definieren wollen. Die Leistung ist mit #2 gleich.
  4. Die flexibelste und leistungsstärkste Option ist sprintf, aber auch die langsamste. Sie können sie verwenden, aber für kürzere Strings, da es ziemlich schwierig wird, diese Lösung nach 4-5 Variablen zu verwenden. Denken Sie daran, dass Sie viel mehr als nur das Einfügen von Variablenwerten in Strings tun können, zum Beispiel das Nummernformat (hex, dezimal, oktal), die Anzahl der Dezimalstellen, das Auffüllen und vieles mehr anzugeben.

Bei Droptica bieten wir seit über 10 Jahren PHP-Entwicklungsdienste an. Dieser Text ist das Ergebnis unserer gesammelten Erfahrungen. Wenn Sie ein Projekt haben, das Expertenwissen in PHP erfordert, zögern Sie nicht, uns zu kontaktieren.

 

-