Neden PHP sprintf işlevi kullanmak?

15 Cevap php

Ben (PHP işlevi sprintf hakkında daha fazla bilgi edinmek için çalışıyorum) ama ben yine karıştı olarak php.net bana çok yardımcı olmadı, neden bunu kullanmak isteyeyim?

Aşağıda benim örnek bir göz atın.

Neden bu kullanın:

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

Bu aynı işi yapar ve IMO yazmak kolaydır zaman:

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

Ben burada bir şey eksik?

15 Cevap

sprintf sadece dizeleri değişken değerleri ekleme çok daha fazlasını yapabileceği anlamına gelir orijinal printf tüm biçimlendirme yetenekleri vardır.

Örneğin, sayı biçimi (onaltılık, onluk, sekizlik), ondalık, dolgu ve daha sayısını belirtin. Printf için Google ve örnekler bol bulabilirsiniz. wikipedia article on printf başlamak gerekir.

Orada sprintf için birçok kullanım durumları vardır ama ben onları kullanmak tek yolu böyle bir dize depolayarak olan: bir veritabanı veya bir PHP sınıfı bir sabit olarak 'Merhaba, My Name% s'. Ben bu dizeyi kullanmak istiyorsanız bu şekilde ben sadece bunu yapabilirsiniz:

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

Esasen bu kod bazı ayrılmasını sağlar. Benim kod birçok yerde 'Merhaba, My Name% s' kullanırsanız ben onu değiştirebilirim bir yerde '% s benim adım' ve her bir durumda gidip dolaşmak zorunda kalmadan, automagicallylar her yerde günceller concatenations.

Başka bir kullanım sprintf sprintf onlar biçim dizesi görünür sırayla olmak zorunda değilsiniz argüman olarak yerelleştirilmiş uygulamalar olduğunu.

Örnek:

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

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

Ama Fransızca gibi bir dil farklı kelimeleri emir:

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

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

(Evet, benim Fransızca berbat: Ben okulda Almanca öğrendim!)

Gerçekte, gettext yerelleştirilmiş dizeleri depolamak için kullanmak istiyorum ama fikir olsun.


Bu çevirmek için daha kolay.

echo _('İşte sonuç:') . $result . _(' Bu tarih için ') . $date;

Çeviri (gettext) dizeleri şimdi:

  • İşte sonuç:
  • Bu tarih için

Bazı başka bir dile tercüme zaman imkansız olabilir ya da çok garip bir cümle olur.

Şimdi varsa

echo sprintf(_("İşte sonuç:%s Bu tarih için %s"), $result, $date);

Çeviri (gettext) dizeleri şimdi:

  • İşte sonuç:%s Bu tarih için %s

Hangi çok daha mantıklı ve diğer dillere çevirmek için çok daha esnek

Ben bulduk iyi neden bunu gerektiği gibi insanlar onları çevirmek ve sipariş edebilirsiniz edildi dil dosyasındaki tüm dil dizeleri yer vermesidir - ama hala olursa olsun dize içinde ne biçim biliyorum - göstermek istiyoruz kullanıcı adı.

Örneğin, siteniz "Welcome back [[User]]" diyecekler sayfanın üstünde. Programcı olarak or care nasıl UI adamlar yazacağız bilmiyorum - sadece kullanıcılar isim yere bir mesaj gösterilir olacak biliyorum.

Yani bu mesaj aslında ne kaygısı olmadan koduna mesajı gömebilirsiniz yok.

Lang dosyası (tr):

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

Sonra da gerçek php kodu bu kullanarak herhangi bir dilde mesaj tipini destekleyebilir.

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

Bahsedildiği gibi, veri girişi biçimlendirme sağlar. Örneğin, 2DP, 4 basamaklı sayılar, vb zorlayarak Bu MySQL sorgu dizeleri oluşturmak için oldukça kullanışlı.

Başka bir avantajı neredeyse parametrelerinde beslenme gibi, içine beslenen verilerinden dize düzenini ayırmak için izin vermesidir. Örneğin, bir MySQL sorgunun durumunda:

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

Bu yöntem, elbette, HTML, vb baskı çıkışı gibi diğer kullanımları, var

Düzenleme: For security reasons, yukarıdaki gibi bir teknik kullanarak you must sanitise all input variables with mysql_real_escape_string(), bu yöntem kullanılarak önce , to prevent MySQL insertion attacks. If you parse unsanitised input, your site and server will get hacked. (Istisna, tabii ki, tamamen kod tarafından inşa edilmiş ve değişkenler güvenli olmasını garanti etmek.)

Eğer çıkış biçimi üzerinde daha hassas bir kontrol gereken yere tipik olgularda bazılarıdır. Örneğin belirli bir değer mekanların belirli miktarda bir sayı, belirli bir kesin biçimde çıkılır onun uzunluğuna bağlı olarak, ön yastıklı veya emin olmak için bu zor olabilir.

Örnekler bol vardır in the PHP manual

Eğer değişkenler bir şey var, özellikle de ne yankı yazmak daha kolay olsa da .. "yazmak için daha kolay" sizin örnek geliyor, sprintf, okumak daha kolaydır.

Eğer güvenli bir şekilde onları sprintf uyumlu çıkış biçimini tanımlamak için izin verebilir - sprintf veya printf kullanmak için başka bir nedeni, bir kullanıcı bazı değerin çıkış biçimini tanımlamak izin istiyorum ki olabilir.

Oh, ve örnek aslında bir kısmı yanlış. sprintf dizesini döndüren, ancak echo değil - sprintf sadece döndüren ise echo, hemen, onu verir ve hiçbir şey döndürür.

  1. Eğer C / C + + kullandıysanız, o zaman sprintf işlevi için kullanılacak.

  2. İkinci satır daha az verimli olduğu iyi bir şans var. Sprintf dize belirteç değişiklik yapmak için tasarlanmış ise yankı, bir çıkış komutu olarak tasarlanmıştır. Ben bir PHP kişi değilim, ama yankısı ile ilgili daha fazla nesne olduğunu sanıyorum. Java gibi davranır ise, her zaman bir şeyler listesine eklenen yeni bir dize oluşturur olur, böylece oluşturulan 4 dizeleri ile bitirmek istiyorum.

Genellikle kullanıcı girişi gelen bir kimlik örneğin, bir tam sayı olduğundan emin olmak için sprintf'i kullanmak:

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

Ayrıca (html posta ya da başka şeyler için) ilkel şablonlar yapmak için kullanılır, bu yüzden birçok yerde bir şablonu yeniden kullanabilirsiniz:

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

O (sekizlik ondalık yeri, vb kontrol) farklı gösterimi sayıları biçimlendirmek için de çok yararlıdır.

Aynı şey i geçenlerde kullandı sürece ben bile olsa. Eğer kullanıcı girişlerine dayalı belgeleri oluşturmak zaman bu kullanışlı olacaktır.

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

Kolayca olarak yazılabilir hangi

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

Bazen ben biraz daha kolay okumak için düşünün böyle bir şey, var:

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

Argüman şablonları kullanarak için aynı biridir. Sen asıl değişken değerler sizin Textsleev ayırmak isteyeceksiniz. Biz yaklaşık belirtilen konum sprintf ek yetkileri yanında sadece bir stil şey.

Bir dize farklı karıştırma zaman sprintf'i kullanmak için gerçekten iyi bir kullanım durumunda, ayrıca sayılar yastıklı biçimleri çıkış ve. Bu birçok durumda daha kolay okunur olması ve süper basit, aynı değişkenin farklı temsilleri, özellikle sayısal olanları baskı yapabilir.

Bu:

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

Da yazılı olabilir:

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

Bence bu okumak için daha net, ama lokalize veya biçimlendirme için kullanımını görebilirsiniz.

numaralarını kullanabilirsiniz dizeleri biçimlendirirken sprintf özellikle yararlıdır. Örneğin,

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

Output: There are -2 oranges in the basket

Portakallar, bir tam sayı (-2) olarak biçimlendirilmiş, ama bir imzasız değerler için u% kullanıyorsa pozitif sayılara sarın olacaktır. Bu davranışı engellemek için, aşağıdaki gibi sıfıra doğru sayıyı yuvarlamak,) mutlak fonksiyonu, abs (kullanın:

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

Output: There are 5 oranges in the basket

Sonuçta, yüksek okunabilirlik, mantıksal inşaat, net biçimlendirme ve gerekli ek değişkenlerin eklenmesi için esneklik ile bir ifadedir. Değişkenlerin sayısı, bu değişkenleri manipüle fonksiyonlarla birlikte arttıkça, yararları daha belirgin hale gelir. Son bir örnek olarak:

$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

Sağ tarafı net kullanılan değişkenler ve nasıl manipüle ediliyor ifade ederken sprintf deyiminin sol tarafı açıkça, dize ve beklenen değerlerin türlerini ifade eder.