De ce să folosiți funcția sprintf în PHP?

Eu sunt încercarea de a afla mai multe despre PHP funcția sprintf (), dar php.net nu m-a ajutat mult ca eu sunt încă confuz, de ce ai vrea să-l folosească?

Uită-te la exemplul meu de mai jos.

De ce să folosiți acest lucru:

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

Atunci când acest lucru face același lucru și este mai ușor să scrie OMI:

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

Îmi lipsește ceva de aici?

Comentarii la întrebare (3)
Soluția

sprintf are toate capabilități de formatare original printf ceea ce înseamnă că poate face mult mai mult decât doar să introduceți valori variabile în siruri de caractere.

De exemplu, specificați formatul de număr (hex, zecimal, octal), numărul de zecimale, umplutură și mai mult. Google pentru printf și te'll găsi o mulțime de exemple. A articolul de pe wikipedia printf ar trebui să obține ai început.

Comentarii (4)

Există multe cazuri de utilizare pentru sprintf dar într-un fel pe care eu le folosesc este de memorarea unui șir de caractere astfel: 'Bună ziua, Numele Meu este %s' într-o bază de date sau ca o constantă într-o clasă PHP. În acest fel atunci când vreau să folosesc acel șir nu pot pur și simplu a face acest lucru:

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

În esență, aceasta permite o separare în cod. Dacă am folosi 'Bună ziua, Numele Meu este %s' în multe locuri din codul meu nu pot schimba-l la '%s este numele meu' într-un singur loc și se actualizează oriunde altundeva mod automat, fără a fi nevoie pentru a merge la fiecare instanță și pentru a muta în jurul valorii de înlănțuirilor.

Comentarii (1)

O altă utilizare a sprintf e în aplicații localizate ca argumente pentru a sprintf don't trebuie să fie în ordinea în care acestea apar în șir format.

Exemplu:

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

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

Dar o limbă ca franceza ordine cuvintele diferit:

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

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

(Da, franceza mea e de rahat: am învățat limba germană în școală!)

În realitate,'d folosi gettext pentru a stoca siruri de caractere localizate, dar ai prins ideea.


Comentarii (0)

L's ușor pentru a traduce.

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

Traducere (gettext) siruri de caractere sunt acum:

  • Aici este rezultatul:
  • pentru această dată

Atunci când tradus în altă limbă ar fi imposibilă sau că rezultatele foarte ciudat exemple.

Acum, dacă aveți

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

Traducere (gettext) siruri de caractere este acum:

  • Aici este rezultatul: %s pentru această dată %s

Ceea ce îl face mult mai mult sens și it's mult mai flexibil pentru a traduce în alte limbi

Comentarii (3)

Cel mai bun motiv pe care l-am găsit este faptul că vă permite de a plasa toate siruri de caractere de limbă în limba dosar au fost oamenii pot traduce si comanda-le după cum este necesar - și totuși încă mai știu că, indiferent ce format șirul este într - doriți pentru a afișa nume de utilizatori.

De exemplu, site-ul va spune "bine ai revenit [[User]]" pe partea de sus a paginii. Ca programator nu't știu sau de îngrijire cum UI baieti sunt de gând să scrie că - tu doar știi că un nume de utilizatori va fi prezentat undeva într-un mesaj.

Deci nu poate încorpora mesaj în codul fara sa iti faci griji despre ce mesaj este de fapt.

Lang fișier (RO):

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

Apoi, puteți sprijini orice tip de mesaj, în orice limbă, folosind acest lucru în actuala cod php.

sprintf($lang['welcome_message'], $user->name())
Comentarii (2)

de ce ai vrea să-l folosească?

Se dovedește foarte util atunci când se utilizează o (extern) - sursă pentru limba siruri de caractere. Dacă aveți nevoie de un număr fix de variabile într-un anumit dicționar șir, trebuie doar să știu corectă comanda:

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

Introdus variabile don't chiar trebuie să fie la începutul sau sfârșitul în mai multe limbi, numai ordonarea lor contează.

Desigur, ai putea scrie propriile funcții pentru a efectua acest înlocui, fără îndoială, chiar cu unele mici creșteri de performanță, dar este mult mai rapid doar la (dată ai o clasa de "Limba" pentru a citi siruri de caractere de limbă):

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

De asemenea, vine cu capacități complete de "printf", astfel este, de asemenea, un one-liner pentru formatarea numeroase tipuri de variabile, de exemplu:

  • număr în virgulă mobilă ieșire precizie, sau
  • completarea numere întregi cu zero.
Comentarii (0)

După cum sa menționat, aceasta vă permite formatarea datelor de intrare. De exemplu, forțându-2dp, de 4 cifre, numere, etc. L's destul de util pentru construirea MySQL query strings.

Un alt avantaj este faptul că vă permite să se separe aspectul șir de date de a fi hrănit în ea, aproape ca și cum ai hrăni în paramaters. De exemplu, în caz de o interogare 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);

Această metodă are, desigur, au și alte utilizări, cum ar fi atunci când imprimați de ieșire ca HTML, etc.

Edit: din motive De securitate, atunci când se utilizează o tehnică ca și mai sus trebuie să-și igienizeze toate variabilele de intrare cu mysql_real_escape_string()` înainte de a utiliza această metodă, pentru a preveni MySQL inserție atacuri. Dacă analiza unsanitised intrare, site-ul și serverul va fi spart. (Cu excepția, desigur, variabilele care au fost construite de cod și sunt garantate pentru a fi în siguranță.)

Comentarii (2)

Folosind sprintf() este mult mai curat și mai sigur de a formata șir.

De exemplu, atunci când're de-a face cu variabile de intrare, previne surprize neașteptate specificând formatul așteptat în avans (de exemplu,'re așteaptă string [%s] sau numărul [%d]). Acest lucru ar putea ajuta cu posibil risc de SQL injection, dar nu o't preveni dacă șirul consta citate.

Aceasta ajută, de asemenea, de-a face cu flotoare, puteți specifica în mod explicit cifre de precizie (de exemplu,%.2f), care salvează de la folosind funcții de convertire.

Alte avantaje este că majoritatea dintre cele mai importante limbaje de programare au propriile lor punerea în aplicare a sprintf(), astfel încât odată ce te familiarizezi cu el, l's chiar mai ușor de utilizat, mai degrabă decât de a învăța o nouă limbă (ca și cum pentru a concatena șiruri sau de conversie pluteste).

În rezumat, l's-o bună practică de a utiliza, în scopul de a avea o mai curat și mai ușor de citit codul.

De exemplu, a se vedea mai jos exemplu:

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

Sau un exemplu simplu care imprimă exemplu'1','2','3','4':

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

și de imprimare cu string formatat:

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

unde printf()este echivalent cusprintf()`, dar produce un string formatat în loc de a se întoarce (de variabilă).

Care este mai ușor de citit?

Comentarii (3)

Asta:

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

Ar putea fi, de asemenea, scris:

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

În opinia mea, acest lucru este clar pentru a citi, dar nu pot vedea folosi pentru localizare, sau de formatare.

Comentarii (0)

Chiar și eu, deși același lucru dacă nu am folosit-o recent. Atunci când ai de a genera documente bazate pe intrări de utilizator, acesta va fi la îndemână.

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

Care poate fi ușor de scris ca

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);
Comentarii (2)

Ei bine, sprintf are multe capacități ca stim un exemplu, ca mai jos:

Acum cateva luni am fost în nevoie de conversie de secunde pentru a oră:minute:secunde format Ca $t = 494050 //secunde am vrut să imprimați ca 137 h 14 m 10 s asa ca am venit cu php function springf() tin doar de câteva secunde în $t " și " ecou sprintf("%02d h %s%02d m %s%02d s", etaj($t/3600), $f, ($t/60)%60, $f, $t%60); dă-mi 137 h 14 m 10 s

sprintf() funcție este foarte utilă dacă știm cum să-l folosească.

Comentarii (0)
  1. Daca'am folosit C/C++, atunci v-ar fi folosit de funcția sprintf.

  2. Acolo este o șansă bună ca cea de-a doua linie este mai puțin eficientă. Echo este conceput ca o ieșire de comandă, întrucât sprintf este conceput pentru a face string token înlocuire. Am'm nu un PHP persoană, dar bănuiesc că există mai multe obiecte implicate cu ecou. În cazul în care acționează ca Java ar fi, se creează un nou șir de fiecare dată când ceva este adăugat la lista, deci'd încheie cu 4 siruri de caractere creat.

Comentarii (2)

Uneori am ceva de genul asta, pe care o consider un pic mai ușor de citit:

$fileName = sprintf('thumb_%s.%s', 
                    $fileId,
                    $fileInfo['extension']);
Comentarii (0)

Eu folosesc, de obicei sprintf pentru a se asigura că un id care vin din partea utilizatorului de intrare este un număr întreg de exemplu:

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

De asemenea, este folosit pentru a face rudimentar template-uri (pentru mail-uri html sau altele), astfel încât să puteți reutiliza un șablon în multe locuri:

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

L's foarte util, de asemenea, pentru a formata numere în diferite reprezentări (octal, controlul zecimală, etc).

Comentarii (2)
define('TEXT_MESSAGE', 'The variable "%s" is in the middle!');

sprintf(TEXT_MESSAGE, "Var1");
sprintf(TEXT_MESSAGE, "Var2");
sprintf(TEXT_MESSAGE, "Var3");
Comentarii (0)

Unele dintre cazurile tipice sunt în cazul în care ai nevoie de un control mai precis asupra formatul de ieșire. Ea poate fi dificil, de exemplu, asigurați-vă că o valoare specifică a anumită sumă de spații căptușit în față, în funcție de lungimea acestuia, sau că un număr este redat într-o anumită precise format.

Există o mulțime de exemple în manualul PHP

De asemenea, ceea ce vine în exemplul de "mai ușor să scrie".. în Timp ce ecou poate fi mai ușor să scrie, sprintf este mai ușor de citit, mai ales dacă aveți o mulțime de variabile.

Un alt motiv pentru a folosi sprintf sau printf ar putea fi faptul că vrei să lași un utilizator defini formatul de ieșire de o anumită valoare - puteți în condiții de siguranță a le permite să definească un sprintf compatibil cu formatul de ieșire.

Oh, și exemplul tău este de fapt greșit pentru o parte. sprintf returnează șirul, dar "echo", nu - "echo", imediat ieșiri și a se întoarce nimic, în timp ce sprintf doar se întoarce.

Comentarii (0)

sprintf este deosebit de util atunci când formatarea siruri de caractere care folosesc numere. De exemplu,

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

Output: There are -2 oranges in the basket

Portocale este formatată ca număr întreg (-2), dar se va încadra în jurul valorii de numere pozitive dacă se folosește %u pentru nesemnate valori. Pentru a evita acest comportament, eu folosesc absolut functia abs(), pentru a rotunji numărul de spre zero, după cum urmează:

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

Output: There are 5 oranges in the basket

Rezultatul final este o declarație cu grad ridicat de lizibilitate, construcție logică, clară formatare, și flexibilitate pentru adăugarea de variabile suplimentare după cum este necesar. Cu cât numărul de variabile crește în combinație cu funcții care manipulează aceste variabile, beneficiile devin mai evidente. Ca un exemplu final:

$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

Partea stângă a sprintf declarație exprimă în mod clar șir și tipurile de valorile preconizate, în timp ce partea dreapta exprimat în mod clar variabilele utilizate și modul în care acestea sunt manipulate.

Comentarii (1)

Argumentul este același cu cel pentru folosind template-uri. Te'll doriți pentru a separa Textsleev de variabilă reală valori. În afară de competențele suplimentare de sprintf care ne're pomenit despre asta'e doar o chestie de stil.

Comentarii (0)

Un foarte bun caz de utilizare pentru utilizarea sprintf se aude căptușit formate de numere și, de asemenea, atunci când se amestecă diferite tipuri într-un șir. Acesta poate fi mai ușor de citit în multe cazuri și de a face super-simplu pentru a imprima diferite reprezentări ale acelorași variabile, mai ales cele numerice.

Comentarii (0)

Folosind sprintf() funcția de peste ordinare de concatenare are avantajul că se pot aplica diferite tipuri de formatare pe variabile pentru a fi concatenate.

În cazul tău, ai

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

și

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

Să ne ia $rezultat = &#39;a trecut&#39;; date = &#39;23&#39;;

Folosind obișnuit concatenare puteți obține numai de ieșire:

Here is the result: passed for this date 23rd

Cu toate acestea, dacă utilizați sprintf() puteți obține o modificare de ieșire, cum ar fi:

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

Ieșire:

Here is the result: pass for this date 23
Comentarii (0)