Mengapa menggunakan fungsi sprintf di PHP?

188

Saya mencoba mempelajari lebih lanjut tentang fungsi PHP sprintf () tetapi php.net tidak banyak membantu saya karena saya masih bingung, mengapa Anda ingin menggunakannya?

Lihatlah contoh saya di bawah ini.

Mengapa menggunakan ini:

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

Ketika ini melakukan hal yang sama dan lebih mudah untuk menulis IMO:

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

Apakah saya melewatkan sesuatu di sini?

JasonDavis
sumber
40
+1, pertanyaan bagus. Saya jarang menggunakannya sendiri, jadi saya tertarik untuk melihat jawabannya.
zombat
6
Perhatikan bahwa dua contoh Anda tidak setara: yang pertama hanya menetapkan hasilnya $output, sedangkan yang kedua echoadalah hasilnya.
Daniel Pryden
Saya pribadi menggunakannya ketika saya menggabungkan banyak hal. Hanya saat itulah saya merasa berguna, terutama untuk keterbacaan.
AlexMorley-Finch

Jawaban:

130

sprintf memiliki semua kemampuan format printf asli yang berarti Anda dapat melakukan lebih dari sekadar memasukkan nilai variabel dalam string.

Misalnya, tentukan format angka (hex, desimal, oktal), jumlah desimal, padding, dan lainnya. Google untuk printf dan Anda akan menemukan banyak contoh. The artikel wikipedia tentang printf harus Anda mulai.

Isak Savo
sumber
46
Bertahun-tahun yang lalu saya menulis fungsi yang bagus untuk angka nol-padding. Digunakan untuk usia sebelum menyadari saya hanya bisa melakukannyasprintf('%03d', $num)
DisgruntledGoat
5
PHP sprintf memiliki semua kemampuan pemformatan ... sebenarnya tidak ada yang penting, %,8dmisalnya untuk mendapatkan 8 digit yang benar rata dan integer yang dipisahkan koma. Penggunaannya number_formatkurang nyaman dalam suatu printfgaya.
e2-e4
3
@DisgruntledGoat Bisakah Anda memecah string pemformatan itu ('% 03d')? Saya pikir itu akan sangat membantu. Terima kasih.
Tn. Smee
3
Anda juga dapat mengulangi dan menyusun ulang argumen yang akan ditampilkan. misalnya sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');menghasilkanHello World, my name is also World.
fyrye
77

Ada banyak kasus penggunaan untuk sprintf tetapi satu cara saya menggunakannya adalah dengan menyimpan string seperti ini: 'Halo, Nama Saya adalah% s' dalam database atau sebagai konstanta di kelas PHP. Dengan begitu ketika saya ingin menggunakan string itu saya bisa melakukan ini:

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

Intinya memungkinkan beberapa pemisahan dalam kode. Jika saya menggunakan 'Halo, Nama Saya adalah% s' di banyak tempat dalam kode saya, saya dapat mengubahnya menjadi '% s adalah nama saya' di satu tempat dan pembaruan di mana pun secara otomatis, tanpa harus pergi ke setiap contoh dan berpindah-pindah penggabungan.

macinjosh
sumber
8
Ini. Sekarang tambahkan argumen dan terjemahan bernomor:]
Konerak
46

Penggunaan lain sprintfadalah dalam aplikasi lokal sebagai argumen untuk sprintftidak harus dalam urutan mereka muncul dalam format string.

Contoh:

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

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

Tetapi bahasa seperti Prancis memerintahkan kata-kata secara berbeda:

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

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

(Ya, bahasa Prancis saya menyebalkan: Saya belajar bahasa Jerman di sekolah!)

Pada kenyataannya, Anda akan menggunakan gettext untuk menyimpan string yang dilokalkan tetapi Anda mendapatkan idenya.


Ken Keenan
sumber
37

Lebih mudah untuk diterjemahkan.

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

String terjemahan (gettext) sekarang:

  • Inilah hasilnya:
  • untuk tanggal ini

Ketika diterjemahkan ke bahasa lain, itu mungkin tidak mungkin atau menghasilkan kalimat yang sangat aneh.

Sekarang jika sudah

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

String terjemahan (gettext) sekarang:

  • Inilah hasilnya:% s untuk tanggal ini% s

Yang jauh lebih masuk akal dan jauh lebih fleksibel untuk menerjemahkan ke bahasa lain

raspi
sumber
1
Saya melihat di mana ini akan sangat berguna +1
JasonDavis
6
Meskipun untuk terjemahan mungkin akan lebih baik menggunakan 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
penentu
1
Meskipun mereka tidak ada dalam string asli, Anda dapat menempatkannya dalam terjemahan dan itu akan berfungsi.
spektrum
17

Alasan terbaik yang saya temukan adalah memungkinkan Anda menempatkan semua string bahasa dalam file bahasa Anda karena orang dapat menerjemahkan dan memesannya sesuai kebutuhan - namun Anda masih tahu bahwa apa pun format stringnya - Anda ingin menunjukkan nama pengguna.

Misalnya, situs Anda akan mengatakan "Selamat datang kembali [[Pengguna]]" di bagian atas halaman. Sebagai programmer Anda tidak tahu atau peduli bagaimana orang-orang UI akan menulis itu - Anda hanya tahu bahwa nama pengguna akan ditampilkan di suatu tempat di pesan.

Jadi Anda dapat menanamkan pesan ke dalam kode Anda tanpa khawatir tentang apa sebenarnya pesan itu.

File Lang (EN_US):

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

Kemudian Anda dapat mendukung semua jenis pesan dalam bahasa apa pun dengan menggunakan ini dalam kode php Anda yang sebenarnya.

sprintf($lang['welcome_message'], $user->name())
Xeoncross
sumber
Saya tidak pernah perlu khawatir tentang melakukan file bahasa tapi ini sepertinya salah satu kegunaan yang paling berguna bagi saya
JasonDavis
Contoh ini juga masuk akal bagi saya karena saya belum melakukan banyak aplikasi multilang.
MKN Web Solutions
9

mengapa Anda ingin menggunakannya?

Itu terbukti sangat berguna ketika menggunakan sumber (eksternal) untuk string bahasa. Jika Anda membutuhkan jumlah variabel tetap dalam string multibahasa yang diberikan, Anda hanya perlu mengetahui urutan yang benar:

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

Variabel yang dimasukkan bahkan tidak harus di awal atau akhir di berbagai bahasa, hanya masalah pemesanan mereka.

Tentu saja, Anda dapat menulis fungsi Anda sendiri untuk melakukan penggantian ini, tidak diragukan lagi bahkan dengan beberapa peningkatan kinerja kecil, tetapi jauh lebih cepat untuk hanya (mengingat Anda memiliki kelas Languageuntuk membaca string bahasa) :

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

Itu juga datang dengan kemampuan penuh printf, dengan demikian juga merupakan satu-liner untuk memformat berbagai jenis variabel, misalnya:

John Weisz
sumber
8

Seperti yang disebutkan, ini memungkinkan pemformatan data input. Misalnya, memaksa 2dp, angka 4 digit, dll. Ini cukup berguna untuk membangun string kueri MySQL.

Keuntungan lain adalah memungkinkan Anda untuk memisahkan tata letak string dari data yang dimasukkan ke dalamnya, hampir seperti memberi makan di paramaters. Misalnya, dalam kasus permintaan 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);

Metode ini tentu saja memiliki kegunaan lain, seperti saat mencetak hasil sebagai HTML, dll.

Sunting: Untuk alasan keamanan , saat menggunakan teknik seperti di atas Anda harus membersihkan semua variabel input mysql_real_escape_string()sebelum menggunakan metode ini , untuk mencegah serangan penyisipan MySQL. Jika Anda mem-parsing input yang tidak bersih, situs dan server Anda akan diretas . (Dengan pengecualian, tentu saja, variabel yang telah dibangun sepenuhnya oleh kode Anda dan dijamin aman.)

Samuel Jaeschke
sumber
2
Kode itu rentan terhadap injeksi SQL. Gunakan placeholder, bukan interpolasi kueri!
duskwuff -inactive-
@duskwuff - Digunakan apa adanya, Anda benar. Maaf, saya telah mengubah jawaban saya.
Samuel Jaeschke
7

Menggunakan sprintf () jauh lebih bersih dan aman untuk memformat string Anda.

Misalnya ketika Anda berurusan dengan variabel input, itu mencegah kejutan yang tidak terduga dengan menentukan format yang diharapkan di muka (misalnya, bahwa Anda mengharapkan string [ %s] atau angka [ %d]). Ini berpotensi membantu dengan kemungkinan risiko injeksi SQL , tetapi itu tidak akan mencegah jika string terdiri dari tanda kutip.

Ini juga membantu menangani float, Anda dapat secara eksplisit menentukan presisi digit (misalnya %.2f) yang menyelamatkan Anda dari menggunakan fungsi konversi.

Keuntungan lainnya adalah bahwa sebagian besar bahasa pemrograman utama memiliki implementasi sendiri sprintf(), jadi setelah Anda terbiasa, itu bahkan lebih mudah digunakan, daripada belajar bahasa baru (seperti cara menggabungkan string atau mengubah float).

Singkatnya, ini adalah praktik yang baik untuk digunakan agar memiliki kode yang lebih bersih dan lebih mudah dibaca.

Misalnya, lihat contoh nyata di bawah ini :

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

Atau beberapa contoh sederhana yang mencetak misalnya '1','2','3','4':

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

dan mencetak dengan string yang diformat:

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

di mana printf()setara dengan sprintf(), tetapi menghasilkan string yang diformat alih-alih mengembalikannya (ke variabel).

Mana yang lebih mudah dibaca?

kenorb
sumber
1
Saya tidak setuju tetapi juga layak disebut saya menanyakan ini 6-7 tahun yang lalu dan mengingat kembali saya tidak bisa ingat sekali bahwa saya telah menggunakan ini sejak itu! Saya berharap untuk menemukan tempat untuk itu suatu hari nanti dan percaya itu memiliki tempat tetapi lucu untuk berpikir saya belum menggunakannya sejak mengajukan pertanyaan ini bertahun-tahun yang lalu!
JasonDavis
Saya dapat mengatakan bahwa ini agak mirip dengan pengaturan variabel untuk PDO di PHP. Juga jika Anda ingin memberikan argumen keterbacaan, maka dalam hal ini saya lebih suka menggunakan sprintf()dipecah menjadi beberapa baris di mana string dengan placeholder berada pada 1 baris dan nilainya berada pada satu baris atau bahkan beberapa baris di bawahnya, semua indentasi dengan benar dari tentu saja Menggunakan demo Anda dengan cara yang saya jelaskan ... i.imgur.com/DFi3ur8.png
JasonDavis
Pernyataan yang disiapkan bersama dengan prosedur tersimpan adalah cara terbaik untuk mencegah injeksi sql, bukan sprintf. Anda masih dapat dengan mudah menyuntikkan sql menggunakan sprintf, jika string tersebut mengandung satu kutipan
HumbleWebDev
4

Bahkan saya memikirkan hal yang sama kecuali saya menggunakannya baru-baru ini. Ketika Anda menghasilkan dokumen berdasarkan input pengguna ini akan sangat berguna.

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

Yang dapat dengan mudah ditulis sebagai

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);
ikan todak
sumber
Atau Anda dapat melakukan ini: "<p>Some big paragraph {$a['name']} more words {$a['age']}</p>". NAMUN, JANGAN LUPA untuk membersihkan input pengguna atau Anda membuka kode Anda hingga kerentanan XSS.
ketiga
Anda juga dapat menggunakan sintaks HEREDOC . Menurut pendapat saya, keduanya lebih mudah dibaca daripada sintaks sprintf.
thirdender
4

Ini:

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

Bisa juga ditulis:

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

Menurut pendapat saya ini lebih jelas untuk dibaca, tetapi saya bisa melihat penggunaan untuk pelokalan, atau pemformatan.

Thomas Tremain
sumber
3

Beberapa kasus khas adalah di mana Anda memerlukan kontrol yang lebih tepat atas format output. Ini bisa sulit untuk misalnya memastikan nilai tertentu memiliki jumlah ruang tertentu yang empuk ke depan, tergantung pada panjangnya, atau bahwa suatu angka dikeluarkan dalam format spesifik yang spesifik.

Ada banyak contoh dalam manual PHP

Juga apa yang muncul pada contoh Anda "lebih mudah untuk menulis" .. Sementara gema mungkin lebih mudah untuk ditulis, sprintf lebih mudah dibaca, terutama jika Anda memiliki banyak variabel.

Alasan lain untuk menggunakan sprintf atau printf mungkin karena Anda ingin membiarkan pengguna menentukan format output dari beberapa nilai - Anda dapat dengan aman mengizinkan mereka untuk menentukan format output yang kompatibel dengan sprintf.

Oh, dan contoh Anda sebenarnya salah untuk satu bagian. sprintfmengembalikan string, tetapi echotidak - echosegera output dan tidak mengembalikan apa pun, sementara sprintfhanya mengembalikannya.

Jani Hartikainen
sumber
3
  1. Jika Anda menggunakan C / C ++, maka Anda akan terbiasa dengan fungsi sprintf.

  2. Ada peluang bagus bahwa lini kedua kurang efisien. Echo dirancang sebagai perintah keluaran, sedangkan sprintf dirancang untuk melakukan penggantian token string. Saya bukan orang PHP, tapi saya curiga ada lebih banyak objek yang terlibat dengan gema. Jika ini bertindak seperti Java, itu akan menciptakan string baru setiap kali sesuatu ditambahkan ke daftar, sehingga Anda akan berakhir dengan 4 string yang dibuat.

Paul
sumber
Edisi terbaru Java akan mengkonversi string String menjadi StringBuilder di belakang layar.
RodeoClown
1
String dalam PHP bukan objek. Contoh kedua menggunakan konstruksi bahasa alih-alih pemanggilan fungsi sehingga akan terasa lebih cepat.
Tamlyn
3

Terkadang saya mendapat sesuatu seperti ini, yang saya anggap sedikit lebih mudah dibaca:

$fileName = sprintf('thumb_%s.%s', 
                    $fileId,
                    $fileInfo['extension']);
ragum
sumber
3

Saya biasanya menggunakan sprintf untuk memastikan bahwa id yang berasal dari input pengguna adalah bilangan bulat misalnya:

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

Juga digunakan untuk melakukan template yang belum sempurna (untuk email html atau hal-hal lain), sehingga Anda dapat menggunakan kembali template di banyak tempat:

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

Sangat berguna juga untuk memformat angka dalam representasi yang berbeda (oktal, mengontrol tempat desimal, dll).

Castro
sumber
Bukankah lebih mudah hanya menggunakan intval ($ _ GET ["article_id"])? Yah, sebenarnya butuh lebih banyak mengetik ... * mencatat metode Anda "Dag nabbit.
user97410
Untuk jenis kode ini, lebih baik gunakan mysql_real_escape_string (): $ query = sprintf ("SELECT * dari artikel di mana id =% d;", ​​mysql_real_escape_string ($ _ DAPATKAN ['article_id']));
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
sumber
3

sprintf sangat berguna saat memformat string yang menggunakan angka. Sebagai contoh,

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

Output: There are -2 oranges in the basket

Jeruk diformat sebagai bilangan bulat (-2), tetapi akan membungkus ke angka positif jika seseorang menggunakan% u untuk nilai yang tidak ditandatangani. Untuk menghindari perilaku ini, saya menggunakan fungsi absolut, abs (), untuk membulatkan angka ke nol sebagai berikut:

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

Output: There are 5 oranges in the basket

Hasil akhirnya adalah pernyataan dengan keterbacaan tinggi, konstruksi logis, pemformatan yang jelas, dan fleksibilitas untuk penambahan variabel tambahan sesuai kebutuhan. Karena jumlah variabel meningkat dalam kombinasi dengan fungsi yang memanipulasi variabel-variabel ini, manfaatnya menjadi lebih jelas. Sebagai contoh terakhir:

$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

Sisi kiri pernyataan sprintf dengan jelas mengekspresikan string dan jenis nilai yang diharapkan, sementara sisi kanan dengan jelas menyatakan variabel yang digunakan dan bagaimana mereka dimanipulasi.

Ro Mc
sumber
Saya akan menaikkan jawaban Anda untuk kalimat pertama yang sangat bagus ( "sprintf sangat berguna ketika memformat string yang menggunakan angka" ), yang memang merupakan poin terpenting sprintfdalam PHP, tetapi kemudian melihat contoh-contoh yang berbelit-belit itu membuat buah dari "hilang" buah-buahan :), masing-masing berulang kali hanya menampilkan %d(dan abs(), yang tidak relevan untuk topik), alih-alih menunjukkan sebagian besar opsi pemformatan angka (yang akan relevan), saya berubah pikiran. Tetapi jika Anda memperbarui jawabannya, saya akan tetap memiliki upvote saya di lemari es untuk Anda. :) Terima kasih, tepuk tangan!
Sz.
3

Nah, sprintf memiliki banyak kemampuan seperti yang kita ketahui contoh seperti di bawah ini:

Beberapa bulan yang lalu saya perlu mengkonversi detik ke jam: menit: format detik Seperti $t = 494050 //secondssaya ingin mencetak seperti 137 h 14 m 10 sjadi saya datang dengan fungsi php springf()saya hanya memegang detik $tdan echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);memberi saya137 h 14 m 10 s

Fungsi sprintf () sangat berguna jika kita tahu cara menggunakannya.

Sahed
sumber
2

Argumennya sama dengan penggunaan templat. Anda ingin memisahkan Textsleev Anda dari nilai variabel aktual. Selain kekuatan tambahan dari sprintf yang kami sebutkan itu hanya gaya.

worenga
sumber
2

Kasus penggunaan yang sangat baik untuk menggunakan sprintf adalah keluaran format angka empuk dan juga, ketika mencampur berbagai jenis dalam string. Dalam banyak kasus dapat lebih mudah dibaca dan membuatnya sangat mudah untuk mencetak representasi berbeda dari variabel yang sama, terutama yang numerik.

Lloyd Moore
sumber
2

Menggunakan fungsi sprintf () dibandingkan penggabungan biasa memiliki keuntungan bahwa Anda dapat menerapkan berbagai jenis pemformatan pada variabel yang akan digabungkan.

Dalam kasus Anda, Anda punya

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

dan

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

Mari kita ambil $result = 'passed'; date = '23rd';

Menggunakan rangkaian biasa, Anda hanya bisa mendapatkan output:

Here is the result: passed for this date 23rd

Namun jika Anda menggunakan, sprintf()Anda bisa mendapatkan hasil modifikasi seperti:

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

Keluaran:

Here is the result: pass for this date 23

sumber
2

sprintf()sangat mirip dengan printf(). Jika Anda tahu printf()secara detail maka sprintf()dan bahkan vsprintf()tidak terlalu sulit untuk dipahami.

salah satu hal yang berbeda sprintf()dari printf()adalah bahwa Anda akan perlu mendeklarasikan variabel untuk menangkap output dari fungsi karena tidak langsung mencetak / menggema apa pun. Coba lihat cuplikan kode berikut:

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"

Semoga itu bisa membantu.

Vuong
sumber
1

Satu "output", yang lain "kembali", itulah salah satu perbedaan utama.

printf() Keluaran

sprintf() Kembali

Mohd Abdul Mujib
sumber
0

Anda harus berhati-hati saat menggunakan sprintf dalam loop:

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

Yang mengarah ke waktu berikut (di mesin lokal saya dengan PHP 7.2):

Loop: 10000000

'$ a. $ b. $ c. $ d. $ e. $ f membutuhkan 1.4507689476013s

"$ a $ b $ c $ d $ e $ f" membutuhkan 1.9958319664001s

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

g3rdn
sumber
0

Saya menggunakannya untuk pesan ke pengguna atau jenis fungsionalitas "cantik" lainnya. Misalnya, jika saya tahu saya akan menggunakan nama pengguna.

$name = 'Some dynamic name';

Dan memiliki beberapa pesan untuk digunakan dalam situasi itu. (Yaitu, memblokir atau mengikuti pengguna lain)

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

Anda dapat membuat fungsi umum yang melakukan sesuatu kepada pengguna dan menambahkan string ini, dan tidak peduli apa struktur kalimat itu harus terlihat cukup bagus. Saya selalu tidak suka hanya menambahkan string bersama dan terus-menerus menggunakan notasi titik dan menutup dan membuka kembali string hanya untuk membuat kalimat terlihat bagus. Saya adalah penggemar pada awalnya seperti kebanyakan tetapi ini tampaknya cukup berguna ketika beberapa string perlu dimanipulasi dan Anda tidak ingin kode keras penempatan variabel di setiap waktu.

Pikirkan itu, apa yang terlihat lebih baik?

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

Atau

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

Tentu ini merupakan langkah ekstra tetapi bagaimana jika pemeriksaan bersyarat Anda melakukan banyak hal fungsional lainnya, maka kutipan dan penambahan mulai menghalangi pengkodean secara fungsional.

Douglas Richardson
sumber