Mengapa menggunakan fungsi sprintf di PHP?

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

Lihatlah contoh di bawah ini.

Mengapa menggunakan ini:

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

Saat ini tidak sama dan lebih mudah untuk menulis IMO:

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

Aku melewatkan sesuatu di sini?

Mengomentari pertanyaan (3)
Larutan

sprintf memiliki semua kemampuan format asli printf yang berarti anda dapat melakukan jauh lebih banyak daripada hanya memasukkan nilai-nilai variabel dalam string.

Misalnya, menentukan format angka (hex, desimal, oktal), jumlah desimal, padding dan banyak lagi. Google untuk printf dan anda'll menemukan banyak contoh. The artikel wikipedia pada printf harus mendapatkan anda mulai.

Komentar (4)

Ada banyak kasus penggunaan untuk sprintf tapi salah satu cara yang saya gunakan adalah dengan menyimpan string seperti ini: 'Halo, Nama Saya %s' di database atau sebagai konstanta dalam PHP kelas. Dengan cara itu ketika saya ingin menggunakan string yang aku hanya bisa lakukan ini:

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

Pada dasarnya hal ini memungkinkan beberapa pemisahan dalam kode. Jika saya menggunakan 'Halo, Nama Saya %s' di banyak tempat dalam kode saya dapat mengubahnya ke '%s adalah nama saya' di satu tempat dan update di mana-mana lagi yang otomatis, tanpa harus pergi ke masing-masing contoh dan bergerak di sekitar penggabungan.

Komentar (1)

Penggunaan lain dari sprintf adalah aplikasi lokal sebagai argumen untuk sprintf don't harus berada dalam urutan mereka muncul dalam format string.

Contoh:

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

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

Tapi bahasa seperti perancis perintah kata-kata yang berbeda:

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

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

(Ya, saya orang perancis menyebalkan: saya belajar bahasa jerman di sekolah!)

Pada kenyataannya, anda'd gunakan gettext untuk menyimpan string lokal tetapi anda mendapatkan ide.


Komentar (0)

It's mudah untuk menerjemahkan.

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

Terjemahan (gettext) string yang sekarang:

  • Berikut adalah hasilnya:
  • untuk saat ini

Ketika diterjemahkan ke beberapa bahasa lainnya yang mungkin atau mungkin ini hasil yang sangat aneh kalimat.

Sekarang jika anda memiliki

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

Terjemahan (gettext) string sekarang:

  • Berikut adalah hasilnya: %s untuk saat ini %s

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

Komentar (3)

Alasan terbaik yang saya temukan adalah bahwa hal itu memungkinkan anda untuk menempatkan semua bahasa string dalam file bahasa yang orang-orang dapat menerjemahkan dan agar mereka diperlukan, namun anda masih tahu bahwa tidak peduli apa format string - anda ingin menunjukkan nama pengguna.

Misalnya, situs anda akan mengatakan "Selamat datang kembali [[Pengguna]]" pada bagian atas halaman. Sebagai programmer, anda don't tahu atau perawatan bagaimana UI-orang yang akan menulis bahwa - anda hanya tahu bahwa nama pengguna akan ditampilkan di suatu tempat di pesan.

Jadi anda bisa cantumkan pesan ke kode anda tanpa worring tentang apa pesan yang sebenarnya.

Lang file (EN_US):

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

Kemudian anda dapat mendukung setiap jenis pesan dalam setiap bahasa dengan menggunakan ini anda sebenarnya kode-kode php.

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

mengapa anda ingin menggunakannya?

Ini membuktikan sangat berguna ketika menggunakan (eksternal) sumber untuk bahasa string. Jika anda perlu tetap jumlah variabel dalam suatu multibahasa string, anda hanya perlu tahu yang benar memesan:

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

Dimasukkan variabel don't bahkan harus berada di awal atau akhir di beberapa bahasa, hanya mereka memesan hal-hal.

Tentu saja, anda bisa menulis anda sendiri berfungsi untuk melakukan ganti ini, tidak diragukan lagi bahkan dengan beberapa minor kinerja meningkat, tapi hal ini jauh lebih cepat untuk hanya (mengingat anda memiliki kelas Bahasa untuk membaca bahasa string):

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

Hal ini juga dilengkapi dengan kemampuan penuh dari printf, demikian juga satu-liner untuk memformat berbagai jenis variabel, misalnya:

  • floating point nomor keluaran presisi, atau
  • mengisi bilangan bulat dengan nol.
Komentar (0)

Seperti disebutkan, hal ini memungkinkan format input data. Misalnya, memaksa 2dp, 4-digit angka, dll. It's sangat berguna untuk membangun MySQL query string.

Keuntungan lain adalah bahwa hal itu memungkinkan anda untuk memisahkan letak string dari data yang dimasukkan ke dalamnya, hampir suka makan di parameter. Misalnya, dalam kasus query 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 ketika mencetak output seperti HTML, dll.

Edit: Untuk alasan keamanan, ketika menggunakan teknik seperti di atas anda harus membersihkan semua variabel input dengan mysql_real_escape_string() sebelum menggunakan metode ini, untuk mencegah MySQL penyisipan serangan. Jika anda mengurai unsanitised input, situs dan server akan mendapatkan hacked. (Dengan pengecualian, tentu saja, variabel-variabel yang telah benar-benar dibangun oleh kode anda dan dijamin aman.)

Komentar (2)

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

Misalnya ketika anda're berurusan dengan input variabel, mencegah kejutan yang tak terduga dengan menentukan format yang diharapkan di muka (misalnya, bahwa anda're mengharapkan string [%s] atau [%d]). Hal ini berpotensi membantu dengan kemungkinan risiko SQL injection, tapi itu tidak't mencegah jika string yang terdiri kutipan.

Hal ini juga membantu berurusan dengan mengapung, anda dapat secara eksplisit menentukan digit presisi (misalnya %.2f) yang menyelamatkan anda dari menggunakan fungsi convert.

Keuntungan lain adalah bahwa sebagian besar bahasa pemrograman memiliki implementasi sendiri sprintf(), jadi setelah anda mendapatkan akrab dengan it, it's bahkan lebih mudah untuk digunakan, daripada belajar bahasa baru (seperti bagaimana untuk menggabungkan string atau mengkonversi mengapung).

Singkatnya,'s merupakan praktik yang baik untuk digunakan dalam rangka untuk memiliki yang lebih bersih dan lebih mudah dibaca kode.

Untuk contoh, lihat di bawah contoh nyata:

$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 cetak dengan format string:

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

di mana printf() setara dengan sprintf(), tetapi output yang diformat string bukannya kembali hal (variabel).

Yang lebih mudah dibaca?

Komentar (3)

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 saya ini lebih jelas untuk dibaca, tapi aku bisa melihat penggunaan untuk lokalisasi, atau format.

Komentar (0)

Bahkan saya meskipun hal yang sama kecuali aku digunakan baru-baru ini. Ketika anda menghasilkan dokumen berdasarkan input pengguna ini akan 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);
Komentar (2)

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

Beberapa bulan yang lalu saya sedang membutuhkan konversi detik ke jam:menit:detik format Seperti $t = 494050 //detik saya ingin cetak seperti 137 jam 14 m 10 s jadi saya datang dengan fungsi php springf() aku hanya memegang detik $t dan echo sprintf(" 02d%h %s%02d m %s%02d s", lantai($t/3600), $f, ($t/60)%60, $f $t%60); memberi saya 137 jam 14 m 10 s

sprintf() fungsi ini sangat berguna jika kita tahu bagaimana menggunakannya.

Komentar (0)
  1. Jika anda've menggunakan C/C++, maka anda akan digunakan untuk fungsi sprintf.

  2. Ada kesempatan baik bahwa baris kedua adalah kurang efisien. Echo dirancang sebagai output perintah, sedangkan sprintf dirancang untuk melakukan string token substitusi. I'm tidak di-PHP orang, tapi saya menduga bahwa ada lebih banyak objek yang terlibat dengan echo. Jika ia bertindak seperti Jawa, itu menciptakan sebuah string baru setiap kali ada sesuatu yang ditambahkan ke dalam daftar, sehingga anda'd berakhir dengan 4 senar yang dibuat.

Komentar (2)

Kadang-kadang aku punya sesuatu seperti ini, yang saya anggap sedikit lebih mudah untuk membaca:

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

Saya biasanya menggunakan sprintf untuk memastikan bahwa id yang berasal dari input user 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 dasar template (untuk html mail atau hal-hal lain), sehingga anda dapat menggunakan kembali kode template di berbagai tempat:

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

It's sangat berguna juga untuk memformat angka dalam representasi yang berbeda (oktal, mengontrol tempat desimal, dll).

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

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

Beberapa kasus yang khas adalah di mana anda membutuhkan lebih banyak kontrol yang lebih tepat output format. Hal ini dapat sulit untuk misalnya pastikan nilai tertentu memiliki jumlah tertentu ruang empuk ke depan, tergantung pada panjangnya, atau bahwa nomor yang ditampilkan dalam menemukan format yang tepat.

Ada banyak contoh di PHP manual]1

Juga apa yang datang kepada anda contoh dari "lebih mudah untuk menulis".. Sedangkan echo mungkin akan lebih mudah untuk menulis, sprintf lebih mudah untuk membaca, terutama jika anda memiliki banyak variabel.

Alasan lain untuk menggunakan sprintf atau printf mungkin bahwa anda ingin membiarkan pengguna menentukan format output dari beberapa nilai - anda dapat dengan aman memungkinkan mereka untuk menentukan sprintf kompatibel format output.

Oh ya, misalnya anda adalah benar-benar salah satu bagian. sprintf mengembalikan string, tapi echo tidak - echo segera output dan mengembalikan apa-apa, sementara sprintf hanya kembali itu.

Komentar (0)

sprintf ini sangat berguna ketika format string yang menggunakan angka. Misalnya,

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

Output: There are -2 oranges in the basket

Jeruk diformat sebagai seluruh nomor (-2), tapi akan membungkus untuk bilangan positif, jika seseorang menggunakan %u untuk nilai-nilai unsigned. Untuk menghindari perilaku ini, saya menggunakan mutlak fungsi abs(), untuk melengkapi jumlah menuju 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 sebuah pernyataan dengan keterbacaan tinggi, konstruksi logis, jelas format, dan fleksibilitas untuk penambahan variabel-variabel tambahan seperti yang diperlukan. Karena jumlah variabel meningkat dalam kombinasi dengan fungsi yang memanipulasi variabel-variabel ini, manfaat 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 sprintf pernyataan jelas mengungkapkan string dan tipe-tipe nilai-nilai yang diharapkan, sementara sisi kanan dengan jelas menyatakan variabel-variabel yang digunakan dan bagaimana mereka sedang dimanipulasi.

Komentar (1)

Argumen adalah salah satu yang sama untuk menggunakan template. Anda'll ingin memisahkan anda Textsleev dari yang sebenarnya nilai-nilai variabel. Selain kekuatan tambahan dari sprintf bahwa kita're disebutkan tentang hal itu's hanya gaya itu.

Komentar (0)

Benar-benar baik use case untuk menggunakan sprintf keluaran empuk format angka dan juga, ketika pencampuran yang berbeda jenis dalam sebuah string. Hal ini dapat lebih mudah untuk membaca dalam banyak kasus dan membuatnya super sederhana untuk mencetak representasi yang berbeda dari variabel yang sama, terutama numerik orang-orang.

Komentar (0)

Menggunakan sprintf() fungsi yang lebih dari biasa rangkaian memiliki keuntungan bahwa anda dapat menerapkan berbagai jenis format pada variabel-variabel yang akan disambung.

Dalam kasus anda, anda memiliki

$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 mengambil $hasil = &#39;lulus&#39;; tanggal = &#39;23&#39;;

Biasa menggunakan rangkaian anda hanya bisa mendapatkan output:

Here is the result: passed for this date 23rd

Namun jika anda menggunakan sprintf() anda bisa mendapatkan dimodifikasi output seperti:

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

Output:

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