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?
$output
, a drugiecho
to.Odpowiedzi:
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ąć.
źródło
sprintf('%03d', $num)
%,8d
na przykład, aby uzyskać poprawnie wyrównaną liczbę 8 cyfr i oddzielone przecinkami liczby całkowite. Korzystanienumber_format
jest mniej wygodne w dobrymprintf
stylu.sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');
wynikuHello World, my name is also World.
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ć:
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.
źródło
Kolejnym zastosowaniem
sprintf
jest zlokalizowane aplikacje jako argumentysprintf
nie muszą być w kolejności, w jakiej występują w ciągu formatu.Przykład:
Ale język taki jak francuski porządkuje słowa inaczej:
(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ł.
źródło
Łatwiej jest przetłumaczyć.
Ciągi tłumaczenia (gettext) są teraz:
Przetłumaczone na inny język może być niemożliwe lub może prowadzić do bardzo dziwnych zdań.
Teraz jeśli masz
Ciągi tłumaczenia (gettext) są teraz:
Co ma o wiele większy sens i jest o wiele bardziej elastyczne w tłumaczeniu na inne języki
źródło
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
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):
Następnie możesz obsługiwać dowolny rodzaj wiadomości w dowolnym języku, używając tego w swoim prawdziwym kodzie php.
źródło
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
hu.txt
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ę
Language
do czytania ciągów językowych) :Posiada również pełne możliwości
printf
, dlatego jest również jednokierunkowym formatowaniem wielu typów zmiennych, na przykład:źródło
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:
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.)źródło
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
%.2f
zmiennoprzecinkowymi , 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 :
Lub prosty przykład, który drukuje np .
'1','2','3','4'
:i drukowanie ze sformatowanym łańcuchem:
gdzie
printf()
jest równoważne zsprintf()
, ale wyświetla sformatowany ciąg zamiast zwracać go (do zmiennej).Który jest bardziej czytelny?
źródło
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.pngNawet 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.
Które można łatwo zapisać jako
źródło
"<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.To:
Można również napisać:
Moim zdaniem jest to łatwiejsze do odczytania, ale widzę zastosowanie do lokalizacji lub formatowania.
źródło
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.
sprintf
zwraca ciąg, aleecho
nie -echo
natychmiast go wypisuje i nic nie zwraca, asprintf
tylko zwraca.źródło
Jeśli używałeś C / C ++, to przywykłbyś do funkcji sprintf.
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.
źródło
Czasami mam coś takiego, co uważam za nieco łatwiejsze do odczytania:
źródło
Zwykle używam sprintf, aby upewnić się, że identyfikator pochodzący z danych wejściowych użytkownika jest liczbą całkowitą, na przykład:
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:
Bardzo przydatne jest także formatowanie liczb w różnych reprezentacjach (ósemkowe, kontrolowanie miejsca dziesiętnego itp.).
źródło
źródło
sprintf jest szczególnie użyteczny podczas formatowania ciągów, które używają liczb. Na przykład,
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:
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:
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.
źródło
sprintf
PHP, ale potem zobaczyłem te zawiłe przykłady, tworząc owoce z „brakujących” owoce :), każdy wielokrotnie pokazując tylko%d
(iabs()
, 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!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 //seconds
chciałem wydrukować,137 h 14 m 10 s
więc wymyśliłem funkcję php,springf()
po prostu trzymam sekundy$t
iecho 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ć.
źródło
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.
źródło
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.
źródło
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
i
Weźmy
$result = 'passed'; date = '23rd';
Za pomocą zwykłej konkatenacji można uzyskać tylko wynik:
Jeśli jednak użyjesz
sprintf()
, możesz uzyskać zmodyfikowane dane wyjściowe, takie jak:Wynik:
źródło
sprintf()
jest dość podobny doprintf()
. Jeśli wieszprintf()
szczegółowo, tosprintf()
nawetvsprintf()
nie jest naprawdę trudne do zrozumienia.jedną z rzeczy, która różni się
sprintf()
odprintf()
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:Mam nadzieję, że to pomaga.
źródło
Jedno „wyjście”, drugie „powrót”, to jedna z głównych różnic.
printf()
Wyjściasprintf()
Zwrotyźródło
Podczas używania sprintf w pętlach należy zachować ostrożność:
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
źródło
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.
I mieć wiele wiadomości do wykorzystania w tej sytuacji. (Tzn. Blokowanie lub śledzenie innego użytkownika)
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?
Lub
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.
źródło