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?
185
24
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.
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:
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.
Penggunaan lain dari
sprintf
adalah aplikasi lokal sebagai argumen untuksprintf
don't harus berada dalam urutan mereka muncul dalam format string.Contoh:
Tapi bahasa seperti perancis perintah kata-kata yang berbeda:
(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.
It's mudah untuk menerjemahkan.
Terjemahan (gettext) string yang sekarang:
Ketika diterjemahkan ke beberapa bahasa lainnya yang mungkin atau mungkin ini hasil yang sangat aneh kalimat.
Sekarang jika anda memiliki
Terjemahan (gettext) string sekarang:
Yang jauh lebih masuk akal dan itu's jauh lebih fleksibel untuk menerjemahkan ke bahasa lain
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):
Kemudian anda dapat mendukung setiap jenis pesan dalam setiap bahasa dengan menggunakan ini anda sebenarnya kode-kode php.
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
hu.txt
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):Hal ini juga dilengkapi dengan kemampuan penuh dari
printf
, demikian juga satu-liner untuk memformat berbagai jenis variabel, misalnya: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:
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.)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:
Atau beberapa contoh sederhana yang mencetak misalnya
'1','2','3','4'
:dan cetak dengan format string:
di mana
printf()
setara dengansprintf()
, tetapi output yang diformat string bukannya kembali hal (variabel).Yang lebih mudah dibaca?
Ini:
Bisa juga ditulis:
Menurut saya ini lebih jelas untuk dibaca, tapi aku bisa melihat penggunaan untuk lokalisasi, atau format.
Bahkan saya meskipun hal yang sama kecuali aku digunakan baru-baru ini. Ketika anda menghasilkan dokumen berdasarkan input pengguna ini akan berguna.
Yang dapat dengan mudah ditulis sebagai
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 seperti137 jam 14 m 10 s
jadi saya datang dengan fungsi phpspringf()
aku hanya memegang detik$t
danecho sprintf(" 02d%h %s%02d m %s%02d s", lantai($t/3600), $f, ($t/60)%60, $f $t%60);
memberi saya137 jam 14 m 10 s
sprintf() fungsi ini sangat berguna jika kita tahu bagaimana menggunakannya.
Jika anda've menggunakan C/C++, maka anda akan digunakan untuk fungsi sprintf.
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.
Kadang-kadang aku punya sesuatu seperti ini, yang saya anggap sedikit lebih mudah untuk membaca:
Saya biasanya menggunakan sprintf untuk memastikan bahwa id yang berasal dari input user adalah bilangan bulat misalnya:
Juga digunakan untuk melakukan dasar template (untuk html mail atau hal-hal lain), sehingga anda dapat menggunakan kembali kode template di berbagai tempat:
It's sangat berguna juga untuk memformat angka dalam representasi yang berbeda (oktal, mengontrol tempat desimal, dll).
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, tapiecho
tidak -echo
segera output dan mengembalikan apa-apa, sementarasprintf
hanya kembali itu.sprintf ini sangat berguna ketika format string yang menggunakan angka. Misalnya,
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:
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:
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.
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.
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.
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
dan
Mari kita mengambil
$hasil = 'lulus'; tanggal = '23';
Biasa menggunakan rangkaian anda hanya bisa mendapatkan output:
Namun jika anda menggunakan
sprintf()
anda bisa mendapatkan dimodifikasi output seperti:Output: