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?
$output
, sedangkan yang keduaecho
adalah hasilnya.Jawaban:
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.
sumber
sprintf('%03d', $num)
%,8d
misalnya untuk mendapatkan 8 digit yang benar rata dan integer yang dipisahkan koma. Penggunaannyanumber_format
kurang nyaman dalam suatuprintf
gaya.sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');
menghasilkanHello World, my name is also World.
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:
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.
sumber
Penggunaan lain
sprintf
adalah dalam aplikasi lokal sebagai argumen untuksprintf
tidak harus dalam urutan mereka muncul dalam format string.Contoh:
Tetapi bahasa seperti Prancis memerintahkan kata-kata secara berbeda:
(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.
sumber
Lebih mudah untuk diterjemahkan.
String terjemahan (gettext) sekarang:
Ketika diterjemahkan ke bahasa lain, itu mungkin tidak mungkin atau menghasilkan kalimat yang sangat aneh.
Sekarang jika sudah
String terjemahan (gettext) sekarang:
Yang jauh lebih masuk akal dan jauh lebih fleksibel untuk menerjemahkan ke bahasa lain
sumber
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
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):
Kemudian Anda dapat mendukung semua jenis pesan dalam bahasa apa pun dengan menggunakan ini dalam kode php Anda yang sebenarnya.
sumber
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
hu.txt
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
Language
untuk membaca string bahasa) :Itu juga datang dengan kemampuan penuh
printf
, dengan demikian juga merupakan satu-liner untuk memformat berbagai jenis variabel, misalnya:sumber
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:
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.)sumber
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 :
Atau beberapa contoh sederhana yang mencetak misalnya
'1','2','3','4'
:dan mencetak dengan string yang diformat:
di mana
printf()
setara dengansprintf()
, tetapi menghasilkan string yang diformat alih-alih mengembalikannya (ke variabel).Mana yang lebih mudah dibaca?
sumber
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.pngBahkan saya memikirkan hal yang sama kecuali saya menggunakannya baru-baru ini. Ketika Anda menghasilkan dokumen berdasarkan input pengguna ini akan sangat berguna.
Yang dapat dengan mudah ditulis sebagai
sumber
"<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.Ini:
Bisa juga ditulis:
Menurut pendapat saya ini lebih jelas untuk dibaca, tetapi saya bisa melihat penggunaan untuk pelokalan, atau pemformatan.
sumber
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.
sprintf
mengembalikan string, tetapiecho
tidak -echo
segera output dan tidak mengembalikan apa pun, sementarasprintf
hanya mengembalikannya.sumber
Jika Anda menggunakan C / C ++, maka Anda akan terbiasa dengan fungsi sprintf.
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.
sumber
Terkadang saya mendapat sesuatu seperti ini, yang saya anggap sedikit lebih mudah dibaca:
sumber
Saya biasanya menggunakan sprintf untuk memastikan bahwa id yang berasal dari input pengguna adalah bilangan bulat misalnya:
Juga digunakan untuk melakukan template yang belum sempurna (untuk email html atau hal-hal lain), sehingga Anda dapat menggunakan kembali template di banyak tempat:
Sangat berguna juga untuk memformat angka dalam representasi yang berbeda (oktal, mengontrol tempat desimal, dll).
sumber
sumber
sprintf sangat berguna saat memformat string yang menggunakan angka. Sebagai contoh,
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:
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:
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.
sumber
sprintf
dalam PHP, tetapi kemudian melihat contoh-contoh yang berbelit-belit itu membuat buah dari "hilang" buah-buahan :), masing-masing berulang kali hanya menampilkan%d
(danabs()
, 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!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 //seconds
saya ingin mencetak seperti137 h 14 m 10 s
jadi saya datang dengan fungsi phpspringf()
saya hanya memegang detik$t
danecho 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.
sumber
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.
sumber
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.
sumber
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
dan
Mari kita ambil
$result = 'passed'; date = '23rd';
Menggunakan rangkaian biasa, Anda hanya bisa mendapatkan output:
Namun jika Anda menggunakan,
sprintf()
Anda bisa mendapatkan hasil modifikasi seperti:Keluaran:
sumber
sprintf()
sangat mirip denganprintf()
. Jika Anda tahuprintf()
secara detail makasprintf()
dan bahkanvsprintf()
tidak terlalu sulit untuk dipahami.salah satu hal yang berbeda
sprintf()
dariprintf()
adalah bahwa Anda akan perlu mendeklarasikan variabel untuk menangkap output dari fungsi karena tidak langsung mencetak / menggema apa pun. Coba lihat cuplikan kode berikut:Semoga itu bisa membantu.
sumber
Satu "output", yang lain "kembali", itulah salah satu perbedaan utama.
printf()
Keluaransprintf()
Kembalisumber
Anda harus berhati-hati saat menggunakan sprintf dalam loop:
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
sumber
Saya menggunakannya untuk pesan ke pengguna atau jenis fungsionalitas "cantik" lainnya. Misalnya, jika saya tahu saya akan menggunakan nama pengguna.
Dan memiliki beberapa pesan untuk digunakan dalam situasi itu. (Yaitu, memblokir atau mengikuti pengguna lain)
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?
Atau
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.
sumber