Dlaczego warto korzystać z funkcji sprintf w PHP?

188

Próbuję dowiedzieć się więcej o funkcji PHP sprintf (), ale php.net niewiele mi pomógł, ponieważ nadal jestem zdezorientowany, dlaczego chcesz z niego korzystać?

Spójrz na mój przykład poniżej.

Po co korzystać z tego:

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

Gdy robi to samo i łatwiej jest napisać IMO:

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

Czy coś mi umyka?

JasonDavis
źródło
40
+1, dobre pytanie. Rzadko go używam, więc chcę zobaczyć odpowiedzi.
zombat
6
Zauważ, że twoje dwa przykłady nie są równoważne: pierwszy po prostu przypisuje wynik $output, a drugi echoto.
Daniel Pryden,
Osobiście go używam, kiedy łączę wiele rzeczy. Dopiero wtedy uznaję to za użyteczne, głównie dla czytelności.
AlexMorley-Finch

Odpowiedzi:

130

sprintf ma wszystkie możliwości formatowania oryginalnego printf, co oznacza, że ​​możesz zrobić znacznie więcej niż tylko wstawianie wartości zmiennych do ciągów.

Na przykład określ format liczb (szesnastkowy, dziesiętny, ósemkowy), liczbę miejsc po przecinku, wypełnienie i inne. Google dla printf, a znajdziesz wiele przykładów. Artykuł w Wikipedii dotyczący printf powinien zacząć.

Isak Savo
źródło
46
Wiele lat temu napisałem ciekawą funkcję dla liczb uzupełniających zero. Używane od wieków, zanim zdałem sobie sprawę, że po prostu mogę to zrobićsprintf('%03d', $num)
DisgruntledGoat
5
Sprintf PHP ma wszystkie możliwości formatowania ... w rzeczywistości brakuje ważnego, %,8dna przykład, aby uzyskać poprawnie wyrównaną liczbę 8 cyfr i oddzielone przecinkami liczby całkowite. Korzystanie number_formatjest mniej wygodne w dobrym printfstylu.
e2-e4
3
@DisgruntledGoat Czy możesz rozbić ten ciąg formatujący ('% 03d')? Myślę, że byłoby to bardzo pomocne. Dzięki.
Pan Smee
3
Możesz także powtórzyć i zmienić kolejność wyświetlanych argumentów. np. w sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');wynikuHello World, my name is also World.
fyrye
77

Istnieje wiele przypadków użycia sprintf, ale jednym ze sposobów ich użycia jest przechowywanie takiego ciągu: „Witaj, nazywam się% s” w bazie danych lub jako stała w klasie PHP. W ten sposób, gdy chcę użyć tego ciągu, mogę po prostu to zrobić:

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

Zasadniczo pozwala na pewną separację w kodzie. Jeśli użyję „Witaj, moje imię to% s” w wielu miejscach w moim kodzie, mogę je zmienić na „% s to moje imię” w jednym miejscu i aktualizuje się ono wszędzie indziej automatycznie, bez konieczności przechodzenia do każdej instancji i poruszania się konkatenacje.

macinjosh
źródło
8
To. Teraz dodaj ponumerowane argumenty i tłumaczenia:]
Konerak,
46

Kolejnym zastosowaniem sprintfjest zlokalizowane aplikacje jako argumentysprintf nie muszą być w kolejności, w jakiej występują w ciągu formatu.

Przykład:

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

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

Ale język taki jak francuski porządkuje słowa inaczej:

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

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

(Tak, mój francuski jest do bani: Nauczyłem się niemieckiego w szkole!)

W rzeczywistości użyłbyś gettext do przechowywania zlokalizowanych ciągów, ale masz pomysł.


Ken Keenan
źródło
37

Łatwiej jest przetłumaczyć.

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

Ciągi tłumaczenia (gettext) są teraz:

  • Oto wynik:
  • na tę datę

Przetłumaczone na inny język może być niemożliwe lub może prowadzić do bardzo dziwnych zdań.

Teraz jeśli masz

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

Ciągi tłumaczenia (gettext) są teraz:

  • Oto wynik:% s dla tej daty% s

Co ma o wiele większy sens i jest o wiele bardziej elastyczne w tłumaczeniu na inne języki

raspi
źródło
1
Widzę, gdzie byłoby to bardzo przydatne +1
JasonDavis
6
Mimo tłumaczeń prawdopodobnie byłoby lepiej specyfikatorami pozycji użytkowej, aby umożliwić pewną dodatkową elastyczność podczas tłumaczenia, to znaczy: echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);To pozwoliłoby tłumaczenie zmodyfikować wyrażenie podobnegoFor the date %2$s, the result is %1$s
PatrikAkerstrand
1
Chociaż nawet jeśli nie są obecne w oryginalnym ciągu, możesz umieścić je w tłumaczeniu i będą działać.
spectras
17

Najlepszym powodem, który znalazłem, jest to, że pozwala ci umieścić wszystkie ciągi językowe w twoim pliku językowym, gdzie ludzie mogą tłumaczyć i zamawiać je w razie potrzeby - a mimo to wiesz, że bez względu na format, w jakim znajduje się napis - chcesz pokazać nazwa użytkownika.

Na przykład Twoja strona powie „Witaj ponownie [[Użytkownik]]” u góry strony. Jako programista nie wiesz ani nie obchodzi Cię, jak ludzie z interfejsu będą to pisać - po prostu wiesz, że nazwa użytkownika zostanie wyświetlona gdzieś w wiadomości.

Możesz więc osadzić wiadomość w kodzie, nie martwiąc się o to, czym ona jest.

Plik Lang (EN_US):

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

Następnie możesz obsługiwać dowolny rodzaj wiadomości w dowolnym języku, używając tego w swoim prawdziwym kodzie php.

sprintf($lang['welcome_message'], $user->name())
Xeoncross
źródło
Nigdy nie musiałem się martwić robieniem plików językowych, ale wydaje mi się to jednym z najbardziej przydatnych zastosowań
JasonDavis,
Ten przykład również miał dla mnie idealny sens, ponieważ nie robiłem wielu aplikacji dla wielu stron.
MKN Web Solutions
9

dlaczego chcesz tego użyć?

Jest to bardzo przydatne, gdy używasz (zewnętrznego) źródła dla ciągów językowych. Jeśli potrzebujesz stałej liczby zmiennych w danym ciągu wielojęzycznym, musisz tylko znać prawidłowe uporządkowanie:

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

Wstawiane zmienne nie muszą nawet znajdować się na początku lub na końcu w wielu językach, liczy się tylko ich kolejność.

Oczywiście możesz napisać własną funkcję, aby wykonać tę zamianę, niewątpliwie nawet przy niewielkich wzrostach wydajności, ale jest to o wiele szybsze po prostu (pod warunkiem, że masz klasę Languagedo czytania ciągów językowych) :

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

Posiada również pełne możliwości printf, dlatego jest również jednokierunkowym formatowaniem wielu typów zmiennych, na przykład:

John Weisz
źródło
8

Jak wspomniano, umożliwia formatowanie danych wejściowych. Na przykład wymuszanie 2dp, 4-cyfrowych liczb itp. Jest to całkiem przydatne do budowania ciągów zapytań MySQL.

Kolejną zaletą jest to, że pozwala oddzielić układ ciągu od danych, które są do niego podawane, prawie jak podawanie parametrów. Na przykład w przypadku zapytania 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);

Ta metoda ma oczywiście inne zastosowania, takie jak drukowanie wydruku w formacie HTML itp.

Edycja: Ze względów bezpieczeństwa , stosując powyższą technikę , należy zdezynfekować wszystkie zmienne wejściowe mysql_real_escape_string()przed użyciem tej metody , aby zapobiec atakom z użyciem MySQL. Jeśli przeanalizujesz niechciane dane wejściowe, Twoja witryna i serwer zostaną zhakowane . (Z wyjątkiem, oczywiście, zmiennych, które zostały całkowicie skonstruowane przez Twój kod i są bezpieczne.)

Samuel Jaeschke
źródło
2
Ten kod jest podatny na wstrzyknięcie SQL. Używaj symboli zastępczych, a nie interpolacji zapytań!
duskwuff -inactive-
@duskwuff - Używany bez zmian, masz rację. Przepraszam, poprawiłem swoją odpowiedź.
Samuel Jaeschke,
7

Użycie sprintf () jest znacznie czystsze i bezpieczniejsze do sformatowania łańcucha.

Na przykład, gdy masz do czynienia ze zmiennymi wejściowymi, zapobiega nieoczekiwanym niespodziankom, określając wcześniej oczekiwany format (na przykład, że oczekujesz ciągu [ %s] lub liczby [%d ]). Może to potencjalnie pomóc w potencjalnym ryzyku wstrzyknięcia SQL , ale nie zapobiegnie, jeśli ciąg znaków będzie zawierał cudzysłowy.

Pomaga również radzić sobie z liczbami %.2fzmiennoprzecinkowymi , możesz jawnie określić precyzję cyfr (np. ), Która oszczędza ci korzystania z funkcji konwersji.

Inną zaletą jest to, że większość głównych języków programowania ma własną implementację sprintf() , więc kiedy się z nią zapoznasz, korzystanie z niej jest jeszcze łatwiejsze niż uczenie się nowego języka (np. Jak łączyć ciągi znaków lub konwertować zmiennoprzecinkowe).

Podsumowując, dobrą praktyką jest używanie w celu uzyskania czystszego i bardziej czytelnego kodu.

Na przykład zobacz prawdziwy przykład poniżej :

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

Lub prosty przykład, który drukuje np . '1','2','3','4':

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

i drukowanie ze sformatowanym łańcuchem:

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

gdzie printf()jest równoważne zsprintf() , ale wyświetla sformatowany ciąg zamiast zwracać go (do zmiennej).

Który jest bardziej czytelny?

kenorb
źródło
1
Nie zgadzam się, ale warto też wspomnieć, że spytałem o to 6-7 lat temu i myśląc wstecz, nie mogę sobie przypomnieć, że od tego czasu korzystałem z tego! Mam nadzieję, że kiedyś znajdę na to miejsce i wierzę, że ma to miejsce, ale zabawne jest, że nie skorzystałem z niego, odkąd zadałem to pytanie wiele lat temu!
JasonDavis,
Mogę powiedzieć, że jest to trochę podobne do ustawiania zmiennych dla PDO w PHP. Również jeśli chcesz nadać mu argument czytelności, wtedy wolę użyć sprintf()podziału na wiele linii, gdzie ciąg znaków z symbolami zastępczymi znajduje się na 1 linii, a wartości na linii, a nawet wielu liniach pod nią, wszystkie poprawnie wcięte kierunek. Używam twojego dema w sposób, który opisałem ... i.imgur.com/DFi3ur8.png
JasonDavis
Przygotowane instrukcje w połączeniu z procedurami przechowywanymi to najlepszy sposób zapobiegania iniekcji SQL, a nie sprintf. Nadal możesz łatwo sql wstrzykiwać za pomocą sprintf, jeśli ciąg zawiera pojedynczy cytat
HumbleWebDev
4

Nawet myślałem o tym samym, chyba że ostatnio go użyłem. Przy generowaniu dokumentów na podstawie danych wprowadzonych przez użytkownika będzie to przydatne.

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

Które można łatwo zapisać jako

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);
miecznik
źródło
Czy można to zrobić: "<p>Some big paragraph {$a['name']} more words {$a['age']}</p>". JEDNAK NIE ZAPOMNIJ o dezynfekcji danych wprowadzanych przez użytkownika lub otwierasz swój kod na luki w zabezpieczeniach XSS.
Thirdender
Możesz także użyć składni HEREDOC . Moim zdaniem oba są łatwiejsze do odczytania niż składnia sprintf.
Thirdender
4

To:

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

Można również napisać:

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

Moim zdaniem jest to łatwiejsze do odczytania, ale widzę zastosowanie do lokalizacji lub formatowania.

Thomas Tremain
źródło
3

Niektóre typowe przypadki wymagają dokładniejszej kontroli formatu wyjściowego. Na przykład trudne może być upewnienie się, że określona wartość ma określoną liczbę spacji dopełnionych do przodu, w zależności od jej długości, lub że liczba jest wyprowadzana w określonym, precyzyjnym formacie.

Istnieje wiele przykładów w podręczniku PHP

Także to, co przychodzi do twojego przykładu „łatwiej pisać”. Chociaż echo może być łatwiejsze do napisania, sprintf jest łatwiejszy do odczytania, szczególnie jeśli masz wiele zmiennych.

Innym powodem używania sprintf lub printf może być to, że chcesz pozwolić użytkownikowi zdefiniować format wyjściowy o pewnej wartości - możesz bezpiecznie pozwolić mu zdefiniować format wyjściowy zgodny z sprintf.

Aha, a twój przykład jest błędny z jednej strony. sprintfzwraca ciąg, ale echonie - echonatychmiast go wypisuje i nic nie zwraca, a sprintftylko zwraca.

Jani Hartikainen
źródło
3
  1. Jeśli używałeś C / C ++, to przywykłbyś do funkcji sprintf.

  2. Istnieje duża szansa, że ​​druga linia jest mniej wydajna. Echo jest zaprojektowane jako polecenie wyjściowe, podczas gdy sprintf służy do zastępowania tokenów łańcuchowych. Nie jestem PHP, ale podejrzewam, że echo zawiera więcej obiektów. Jeśli zachowuje się jak Java, tworzy nowy ciąg za każdym razem, gdy coś jest dodawane do listy, więc powstają 4 ciągi.

Paweł
źródło
Najnowsze edycje Java przekonwertują konkatenację String na StringBuilder za kulisami.
RodeoClown,
1
Łańcuchy w PHP nie są obiektami. Drugi przykład wykorzystuje konstrukcję języka zamiast wywołania funkcji, więc będzie niepostrzeżenie szybszy.
Tamlyn
3

Czasami mam coś takiego, co uważam za nieco łatwiejsze do odczytania:

$fileName = sprintf('thumb_%s.%s', 
                    $fileId,
                    $fileInfo['extension']);
imadło
źródło
3

Zwykle używam sprintf, aby upewnić się, że identyfikator pochodzący z danych wejściowych użytkownika jest liczbą całkowitą, na przykład:

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

Służy również do tworzenia podstawowych szablonów (do wiadomości e-mail HTML i innych rzeczy), dzięki czemu możesz ponownie użyć szablonu w wielu miejscach:

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

Bardzo przydatne jest także formatowanie liczb w różnych reprezentacjach (ósemkowe, kontrolowanie miejsca dziesiętnego itp.).

Castro
źródło
Czy nie jest łatwiej po prostu użyć intval ($ _ GET [„article_id”])? Cóż, właściwie zajęło to więcej pisania ... * zanotował twoją metodę „Dag nabbit.
user97410
Dla tego typu kodu lepiej użyć wbudowanego mysql_real_escape_string (): $ query = sprintf („WYBIERZ * z artykułów, gdzie id =% d;”, mysql_real_escape_string ($ _ GET ['id_artykuła]));
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
źródło
3

sprintf jest szczególnie użyteczny podczas formatowania ciągów, które używają liczb. Na przykład,

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

Output: There are -2 oranges in the basket

Pomarańcze są sformatowane jako liczba całkowita (-2), ale zawiną się na liczbach dodatnich, jeśli użyje się% u dla wartości bez znaku. Aby uniknąć tego zachowania, używam funkcji absolutnej, abs (), aby zaokrąglić liczbę w kierunku zera w następujący sposób:

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

Output: There are 5 oranges in the basket

Wynikiem końcowym jest stwierdzenie o wysokiej czytelności, logicznej budowie, czytelnym formatowaniu i elastyczności w dodawaniu dodatkowych zmiennych zgodnie z wymaganiami. Wraz ze wzrostem liczby zmiennych w połączeniu z funkcjami, które manipulują tymi zmiennymi, korzyści stają się bardziej widoczne. Jako ostatni przykład:

$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

Lewa strona instrukcji sprintf wyraźnie wyraża ciąg i typy oczekiwanych wartości, podczas gdy prawa strona wyraźnie wyraża używane zmienne i sposób ich manipulacji.

Ro Mc
źródło
Już miałem głosować za odpowiedzią na twoje doskonałe pierwsze zdanie ( „sprintf jest szczególnie użyteczny podczas formatowania ciągów znaków, które używają liczb” ), co jest rzeczywiście najważniejszym punktem sprintfPHP, ale potem zobaczyłem te zawiłe przykłady, tworząc owoce z „brakujących” owoce :), każdy wielokrotnie pokazując tylko %d(i abs(), co nie ma znaczenia dla tematu), zamiast pokazywać mnóstwo możliwości formatowania liczb (które byłyby odpowiednie), zmieniłem zdanie. Ale jeśli zaktualizujesz odpowiedź, nadal będę mieć dla ciebie moją opinię w lodówce. :) Dzięki, na zdrowie!
Sz.
3

Cóż, sprintf ma wiele możliwości, jak znamy przykład jak poniżej:

Kilka miesięcy temu potrzebowałem przekształcić format sekund na godzinę: minuta: sekundy Tak jak $t = 494050 //secondschciałem wydrukować, 137 h 14 m 10 swięc wymyśliłem funkcję php, springf()po prostu trzymam sekundy $ti echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);daje mi137 h 14 m 10 s

Funkcja sprintf () jest bardzo przydatna, jeśli wiemy, jak z niej korzystać.

Sahed
źródło
2

Argument jest taki sam w przypadku używania szablonów. Będziesz chciał oddzielić Textsleev od rzeczywistych wartości zmiennych. Poza dodatkowymi mocami sprintf, o których wspomnieliśmy, to tylko kwestia stylu.

worenga
źródło
2

Naprawdę dobrym przykładem użycia sprintf jest wyprowadzanie wypełnionych formatów liczb, a także mieszanie różnych typów w ciągu. W wielu przypadkach może być łatwiejszy do odczytania i sprawia, że ​​bardzo proste jest drukowanie różnych reprezentacji tej samej zmiennej, szczególnie numerycznych.

Lloyd Moore
źródło
2

Korzystanie z funkcji sprintf () w porównaniu ze zwykłą konkatenacją ma tę zaletę, że można stosować różne typy formatowania zmiennych, które mają być konkatenowane.

W twoim przypadku masz

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

i

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

Weźmy $result = 'passed'; date = '23rd';

Za pomocą zwykłej konkatenacji można uzyskać tylko wynik:

Here is the result: passed for this date 23rd

Jeśli jednak użyjesz sprintf(), możesz uzyskać zmodyfikowane dane wyjściowe, takie jak:

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

Wynik:

Here is the result: pass for this date 23

źródło
2

sprintf()jest dość podobny do printf(). Jeśli wiesz printf()szczegółowo, to sprintf()nawet vsprintf()nie jest naprawdę trudne do zrozumienia.

jedną z rzeczy, która różni się sprintf()od printf()jest to, że trzeba będzie zadeklarować zmienną złapać wyjście z funkcji, gdyż nie bezpośrednio drukować / echo nic. Zobaczmy następujące fragmenty kodu:

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"

Mam nadzieję, że to pomaga.

Vuong
źródło
1

Jedno „wyjście”, drugie „powrót”, to jedna z głównych różnic.

printf() Wyjścia

sprintf() Zwroty

Mohd Abdul Mujib
źródło
0

Podczas używania sprintf w pętlach należy zachować ostrożność:

$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>';

Co prowadzi do następujących czasów (na mojej lokalnej maszynie z PHP 7.2):

Pętle: 10000000

„$ a. $ b. $ c. $ d. $ e. $ f 'potrzebuje 1.4507689476013s

„$ a $ b $ c $ d $ e $ f” potrzebuje 1,9958319664001s

sprintf ('% s% s% s% s% s% s', $ a, $ b, $ c, $ d, $ e, $ f) potrzebuje 9.1771278381348s

g3rdn
źródło
0

Używam go do wysyłania wiadomości do użytkowników lub innych „ładnych” rodzajów funkcjonalności. Na przykład, jeśli wiem, że użyję nazwy użytkownika.

$name = 'Some dynamic name';

I mieć wiele wiadomości do wykorzystania w tej sytuacji. (Tzn. Blokowanie lub śledzenie innego użytkownika)

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

Możesz stworzyć ogólną funkcję, która robi coś dla użytkownika i dodać ten ciąg, i bez względu na strukturę zdania powinno to wyglądać całkiem ładnie. Zawsze nie lubię dodawać razem ciągów znaków i ciągle używać notacji kropkowej oraz ciągów zamykających i ponownie otwierających, aby zdanie wyglądało dobrze. Z początku byłem fanem, jak większość, ale wydaje się to bardzo przydatne, gdy trzeba manipulować wieloma łańcuchami i nie chcesz za każdym razem umieszczać zmiennej w kodzie.

Pomyśl o tym, co wygląda lepiej?

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

Lub

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

Pewnie, że to dodatkowy krok, ale co, jeśli twoje testy warunkowe wykonują wiele innych czynności funkcjonalnych, wówczas cytaty i dołączanie zaczynają przeszkadzać w funkcjonalnym kodowaniu.

Douglas Richardson
źródło