PHP'de sprintf işlevini neden kullanmalıyım?


188

Ben PHP fonksiyonu sprintf () hakkında daha fazla bilgi edinmek için çalışıyorum ama hala karışık olduğu gibi php.net bana çok yardımcı olmadı, neden kullanmak istersiniz?

Aşağıdaki örneğime bir göz atın.

Neden kullanmalıyım:

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

Bu aynısını yaptığında ve IMO yazmak daha kolay olduğunda:

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

Burada bir şey mi eksik?


40
+1, güzel soru. Nadiren kendim kullanıyorum, bu yüzden cevapları görmek istiyorum.
zombat

6
İki örneğinizin eşdeğer olmadığını unutmayın: İlki basitçe sonucu atar $output, ikincisi ise atar echo.
Daniel Pryden

Ben birçok şeyi birleştirirken ben şahsen kullanıyorum. Sadece o zaman esas olarak okunabilirlik için yararlı buluyorum.
AlexMorley-Finch

Yanıtlar:


130

sprintf orijinal printf'in tüm biçimlendirme yeteneklerine sahiptir, yani dizelere değişken değerler eklemekten çok daha fazlasını yapabilirsiniz.

Örneğin, sayı biçimini (onaltılık, ondalık, sekizli), ondalık sayısı, dolgu ve daha fazlasını belirtin. Printf için Google ve birçok örnek bulacaksınız. Printf üzerinde wikipedia makale başlamak gerekir.


46
Yıllar önce sıfır doldurma sayıları için güzel bir fonksiyon yazdım. Sadece yapabileceğimi fark etmeden önce çağlar boyunca kullanıldısprintf('%03d', $num)
DisgruntledGoat

5
PHP sprintf tüm biçimlendirme yeteneklerine sahiptir ... aslında %,8ddoğru hizalanmış 8 basamaklı ve virgülle ayrılmış tamsayı almak için önemli bir eksik . number_formatBir printftarzda kullanmak daha az uygundur .
e2-e4

3
@DisgruntledGoat Bu biçimlendirme dizesini ('% 03d') parçalayabilir misiniz? Bence çok yardımcı olur. Teşekkürler.
Bay Smee

3
Görüntülenecek bağımsız değişkenleri tekrarlayabilir ve yeniden sıralayabilirsiniz. örneğin sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');sonuçlananHello World, my name is also World.
fyrye

77

Sprintf için birçok kullanım durumu vardır, ancak bunları kullanmanın bir yolu şöyle bir dize depolamaktır: 'Merhaba, Benim Adım% s' bir veritabanında veya bir PHP sınıfında sabit olarak. Bu şekilde bu dizeyi kullanmak istediğimde bunu yapabilirim:

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

Esasen kodda bazı ayrılmalara izin verir. Kodumun birçok yerinde 'Merhaba, Adım% s' kullanıyorsam, bunu tek bir yerde '% s benim adım' olarak değiştirebilirim ve her örneğe gidip hareket etmek zorunda kalmadan otomatik olarak başka her yerde güncellenir concatenations.


8
Bu. Şimdi numaralandırılmış argümanlar ve çeviriler ekleyin:]
Konerak

46

Başka bir kullanımı sprintfda yerelleştirilmiş uygulamalardadır, çünkü argümanların sprintfbiçim dizesinde göründükleri sırayla olmaları gerekmez.

Misal:

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

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

Ama Fransızca gibi bir dil kelimeleri farklı şekilde sıralar:

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

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

(Evet, Fransızlarım berbat: Okulda Almanca öğrendim!)

Gerçekte, yerelleştirilmiş dizeleri saklamak için gettext'i kullanırsınız, ancak fikri anlarsınız.



37

Tercüme etmek daha kolay.

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

Çeviri (gettext) dizeleri artık:

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

Başka bir dile çevrildiğinde imkansız olabilir veya çok garip cümlelerle sonuçlanabilir.

Şimdi varsa

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

Çeviri (gettext) dizeleri artık:

  • Sonuç: Bu tarih için% s% s

Bu çok daha mantıklı ve diğer dillere çevirmek çok daha esnek


1
Bunun çok faydalı olacağını görüyorum +1
JasonDavis

6
Çeviriler için, çevirirken ekstra esneklik sağlamak için konum belirteçleri kullanmak daha iyi olsa da, yani: echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);Bu, bir çevirinin şu ifadeyi değiştirmesine izin verirFor the date %2$s, the result is %1$s
PatrikAkerstrand

1
Orijinal dizede bulunmasalar bile, çeviriye koyabilirsiniz ve işe yarayacaklardır.
spectras

17

Bulduğum en iyi neden, tüm dil dizelerini dil dosyanıza yerleştirmenize izin vermesiydi, insanlar bunları gerektiği gibi çevirebilir ve sipariş edebilirlerdi - yine de dize hangi formatta olursa olsun - göstermek istersiniz kullanıcı adı.

Örneğin, siteniz sayfanın üst kısmında "[Hoş geldiniz] [tekrar hoş geldiniz]" diyecektir. Programcı olarak bilmiyorsunuz veya umursamıyorsunuz nasıl yazacağını - mesajda bir yerde bir kullanıcı adının gösterileceğini biliyorsunuz.

Böylece, iletinin gerçekte ne olduğunu düşünmeden iletiyi kodunuza gömebilirsiniz.

Lang dosyası (EN_US):

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

Daha sonra gerçek php kodunuzda kullanarak herhangi bir dilde herhangi bir mesaj türünü destekleyebilirsiniz.

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

Asla dil dosyaları yapma konusunda endişelenmem gerekiyordu ama bu benim için en faydalı kullanımlardan biri gibi görünüyor
JasonDavis

Bu örnek benim için de çok mantıklıydı çünkü çok dilli uygulamalar yapmadım.
MKN Web Solutions

9

neden kullanmak istesin?

Dil dizeleri için (harici) bir kaynak kullanıldığında çok yararlıdır. Belirli bir çok dilli dizede sabit sayıda değişkene ihtiyacınız varsa, yalnızca doğru sıralamayı bilmeniz gerekir:

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

Girilen değişkenlerin birden fazla dilde başlangıçta veya bitişte olması gerekmez, yalnızca sıralaması önemlidir.

Elbette, bu değişikliği gerçekleştirmek için kendi işlevinizi yazabilirsiniz, şüphesiz bazı küçük performans artışlarıyla bile, ancak sadece çok daha hızlıdır ( Languagedil dizelerini okumak için bir sınıfınız varsa ) :

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

Ayrıca, tam özelliklerle birlikte gelir printf, bu nedenle çok sayıda değişken türünü biçimlendirmek için tek bir astardır, örneğin:


8

Belirtildiği gibi, giriş verilerinin biçimlendirilmesine izin verir. Örneğin, 2dp, 4 basamaklı sayılar vb. Zorlama. MySQL sorgu dizeleri oluşturmak için oldukça kullanışlıdır.

Başka bir avantaj, dizenin düzenini, neredeyse paramaterlerde besleme gibi, beslenmekte olan verilerden ayırmanıza izin vermesidir. Örneğin, bir MySQL sorgusu söz konusu olduğunda:

// 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 çıktıyı HTML olarak yazdırırken vb. Gibi başka kullanımlara da sahiptir.

Düzenleme: Güvenlik nedeniyle , yukarıdaki gibi bir teknik kullanırken , MySQL ekleme saldırılarını önlemek için, bu yöntemi kullanmadan önce tüm giriş değişkenlerini sterilize etmeniz gerekirmysql_real_escape_string() . Onaylanmamış girdileri ayrıştırırsanız, siteniz ve sunucunuz saldırıya uğrayacaktır . (Elbette, kodunuz tarafından tamamen oluşturulmuş ve güvenli olduğu garanti edilen değişkenler hariç).


2
Bu kod SQL enjeksiyonuna karşı savunmasızdır. İnterpolasyon değil, yer tutucu kullanın!
duskwuff -inactive-

@duskwuff - Olduğu gibi kullanılır, haklısın. Üzgünüm, cevabımı değiştirdim.
Samuel Jaeschke

7

Dizenizi biçimlendirmek için sprintf () kullanmak çok daha temiz ve güvenlidir.

Örneğin, giriş değişkenleriyle uğraşırken, beklenen biçimi önceden belirterek (örneğin, dize [ %s] veya sayı [ %d]) beklediğinizden beklenmeyen sürprizleri önler . Bu potansiyel olarak SQL enjeksiyonu riskine yardımcı olabilir , ancak dizenin tırnak içinde olup olmadığını engellemez.

Ayrıca, yüzer öğelerle başa çıkmanıza yardımcı olur, %.2fdönüştürme işlevlerini kullanmanıza engel olan basamak hassasiyetini (ör. ) Açıkça belirtebilirsiniz .

Diğer avantajlar, büyük programlama dillerinin çoğunun kendi uygulamalarına sahip olmasıdır sprintf(), bu yüzden bir kez aşina olduğunuzda, yeni bir dil öğrenmek (dizeleri birleştirmek veya şamandıraları dönüştürmek gibi) yerine kullanmak daha da kolaydır.

Özetle, daha temiz ve daha okunabilir bir koda sahip olmak için kullanmak iyi bir uygulamadır.

Örneğin, aşağıdaki gerçek örneğe bakın :

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

Veya, örneğin '1','2','3','4':

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

ve biçimlendirilmiş dize ile yazdırma:

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

where printf()ile eşdeğerdir sprintf(), ancak onu döndürmek yerine (değişkene) biçimlendirilmiş bir dize çıktılar.

Hangisi daha okunabilir?


1
Katılmıyorum ama aynı zamanda bu 6-7 yıl önce sordum ve geri düşünerek o zamandan beri bunu kullandığım bir kez hatırlayamıyorum! Bir gün bunun için bir yer bulmayı umuyorum ve bunun yıllar önce bu soruyu sorduğumdan beri kullanmadığımı düşünmek için komik ama bir yeri olduğuna inanıyorum!
JasonDavis

Biraz PHP PDO için değişkenleri ayarlamak benzer olduğunu söyleyebiliriz. Ayrıca, okunabilirlik argümanını vermek isterseniz, bu durumda sprintf()yer tutucuları olan dizenin 1 satırda ve değerlerin bir satırda veya hatta birden çok satırda olduğu birden çok satıra bölünmeyi kullanmayı tercih ederim . elbette. Demoyu açıkladığım şekilde kullanma ... i.imgur.com/DFi3ur8.png
JasonDavis

Saklı yordamlarla birlikte hazırlanan ifadeler sprintf değil, sql enjeksiyonunu önlemenin en iyi yoludur. Eğer dize tek bir alıntı içeriyorsa, hala sprintf kullanarak kolayca sql enjekte edebilirsiniz
HumbleWebDev

4

Son zamanlarda kullanmadıkça bile aynı şey olsa. Kullanıcı girişlerine dayalı belgeler oluşturduğunuzda 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.";

Hangi kolayca yazılabilir

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

Veya bunu yapabilirsiniz: "<p>Some big paragraph {$a['name']} more words {$a['age']}</p>". Ancak, kullanıcı girişini sterilize etmeyi UNUTMAYIN veya kodunuzu XSS güvenlik açıklarına kadar açarsınız.
üçüncü

HEREDOC sözdizimini de kullanabilirsiniz . Bence her ikisini de okumak sprintf sözdiziminden daha kolaydır.
üçüncü

4

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

Ayrıca şu şekilde de yazılabilir:

"<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 daha net okunuyor, ancak yerelleştirme veya biçimlendirme kullanımını görebiliyorum.


3

Tipik durumlardan bazıları, çıktı biçimi üzerinde daha hassas kontrole ihtiyaç duyduğunuz yerdir. Örneğin, belirli bir değerin uzunluğuna bağlı olarak öne doğru yerleştirilmiş belirli miktarda boşluğa sahip olduğundan veya belirli bir kesin biçimde bir sayının çıkarıldığından emin olmak zor olabilir.

PHP kılavuzunda çok sayıda örnek var

Ayrıca "yazması daha kolay" örneğinize ne geliyor .. Yankıyı yazmak daha kolay olsa da, özellikle çok değişkeniniz varsa sprintf'i okumak daha kolaydır.

Sprintf veya printf kullanmanın başka bir nedeni, bir kullanıcının belirli bir değerin çıktı biçimini tanımlamasına izin vermek istemeniz olabilir - sprintf uyumlu bir çıktı biçimi tanımlamalarına güvenle izin verebilirsiniz.

Oh ve örneğiniz aslında bir kısım yanlış. sprintfdizeyi döndürür, ancak echovermez - echohemen çıktı verir ve hiçbir şey döndürmez, sprintfyalnızca döndürür.


3
  1. C / C ++ kullandıysanız, sprintf işlevine alırdınız.

  2. İkinci hattın daha az verimli olma şansı yüksektir. Echo bir çıkış komutu olarak tasarlanırken, sprintf string token ikamesi yapmak için tasarlanmıştır. Ben bir PHP kişi değilim, ama yankı ile ilgili daha fazla nesne olduğundan şüpheleniyorum. Java gibi davranıyorsa, listeye her şey eklendiğinde yeni bir dize oluşturur, böylece 4 dize oluşturulur.


Java'nın son sürümleri, String birleşimini sahne arkasındaki StringBuilder biçimine dönüştürür.
RodeoClown

1
PHP dizeleri nesne değildir. İkinci örnek, işlev çağrısı yerine bir dil yapısı kullanır, bu nedenle algılanamaz bir şekilde daha hızlı olur.
Tamlyn

3

Bazen okumamı biraz daha kolay bulduğum bir şey buldum:

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

3

Genellikle kullanıcı girişinden gelen bir kimliğin bir tamsayı olduğundan emin olmak için sprintf kullanın:

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

Ayrıca temel şablonlar (html postaları veya diğer şeyler için) yapmak için kullanılır, böylece şablonu birçok yerde yeniden kullanabilirsiniz:

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

Farklı gösterimlerdeki sayıları biçimlendirmek de çok yararlıdır (sekizli, ondalık basamağı kontrol etmek, vb.).


Sadece intval ($ _ GET ["article_id"]) kullanmak daha kolay değil mi? Aslında ben daha çok yazmaya aldı ... * notları yöntemi" Dag Nabbit aşağı.
user97410

Bu tür kodlar için yerleşik mysql_real_escape_string () kullanın: $ query = sprintf ("SELECT * id =% d;" olan makalelerde, mysql_real_escape_string ($ _ GET ['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");

3

sprintf özellikle sayı kullanan dizeleri biçimlendirirken kullanışlı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

Portakal bir tam sayı (-2) olarak biçimlendirilir, ancak işaretsiz değerler için% u kullanırsa pozitif sayılara sarılacaktır. Bu davranışı önlemek için, sayıyı sıfıra doğru aşağıdaki gibi yuvarlamak için mutlak işlev, abs () kullanıyorum:

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

Output: There are 5 oranges in the basket

Sonuç, yüksek değişkenlik, mantıksal yapı, net biçimlendirme ve gerektiğinde ek değişkenlerin eklenmesi için esnekliğe sahip bir ifadedir. Değişken sayısı, bu değişkenleri işleyen işlevlerle birlikte arttıkça, faydalar daha belirgin hale gelir. Son ö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

Sprintf ifadesinin sol tarafı, dizeyi ve beklenen değer türlerini açıkça ifade ederken, sağ taraf kullanılan değişkenleri ve nasıl değiştirildiklerini açıkça ifade eder.


Ben extellent ilk cümle ( "sprintf özellikle sayıları kullanan dizeleri biçimlendirirken yararlıdır" ) için cevabınızı yükseltmek üzereydim , ki bu aslında sprintfPHP'nin en önemli noktasıdır , ancak daha sonra "eksik" meyve :), her biri tekrar tekrar sadece gösteren %d(ve abs(), konu için alakasız), bazı sayı biçimlendirme seçenekleri ( bununla ilgili olacaktır ) bolluk göstermek yerine, fikrimi değiştirdim. Ama cevabı güncellerseniz, hala benim oyumu buzdolabında saklayacağım. :) Teşekkürler, şerefe!
Sz.

3

Eh, sprintf biz aşağıdaki gibi bir örnek bildiğimiz gibi birçok yeteneklere sahiptir:

Birkaç ay önce Saniyeyi saate dönüştürmeye ihtiyacım vardı: dakika: saniye biçimi $t = 494050 //secondsBen yazdırmak istedim gibi 137 h 14 m 10 sben php fonksiyonu ile geldi springf()ben sadece saniye tutun $tve echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);bana verir137 h 14 m 10 s

sprintf () işlevi, nasıl kullanılacağını bilirsek çok kullanışlıdır.


2

Argüman, şablonların kullanımı ile aynıdır. Textsleev'inizi gerçek değişken değerlerinden ayırmak isteyeceksiniz. Bahsettiğimiz sprintf'in ek güçlerinin yanı sıra sadece stil bir şey.


2

Sprintf'i kullanmak için gerçekten iyi bir kullanım durumu, sayıların dolgulu formatlarını ve bir dizede farklı türleri karıştırırken çıktıdır. Birçok durumda okunması daha kolay olabilir ve aynı değişkenin, özellikle sayısal olanların farklı temsillerini yazdırmayı çok basit hale getirir.


2

Sıradan birleştirme yerine sprintf () işlevinin kullanılması, birleştirilecek değişkenlere farklı biçimlendirme türleri uygulayabilmeniz avantajına sahiptir.

Sizin durumunuzda,

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

ve

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

Alalım $result = 'passed'; date = '23rd';

Sıradan birleştirme kullanarak yalnızca çıktıyı alabilirsiniz:

Here is the result: passed for this date 23rd

Ancak kullanırsanız sprintf()aşağıdaki gibi değiştirilmiş bir çıktı alabilirsiniz:

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

Çıktı:

Here is the result: pass for this date 23

2

sprintf()oldukça benzer printf(). Eğer printf()detaylı olarak biliyorsanız o zaman sprintf()ve hatta vsprintf()anlamak gerçekten zor değil.

şeylerden biri farklıdır o sprintf()gelen printf()doğrudan yazdırmıyor gibi / işlevinden çıkış yakalamak yankı şey bir değişken bildirmek gerek olacaktır. Aşağıdaki kod snippet'lerini görelim:

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"

Umarım yardımcı olur.



0

Döngülerde sprintf kullanırken dikkatli olmalısınız:

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

Bu aşağıdaki sürelere yol açar (PHP 7.2 ile yerel makinemde):

Döngüler: 10000000

'$ a. $ b. $ c. $ d. $ e. $ f '1.4507689476013s ihtiyacı

"$ a $ b $ c $ d $ e $ f" 1,9958319664001s gerekiyor

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


0

Kullanıcılara iletiler veya diğer "güzel" işlevsellik türleri için kullanıyorum. Örneğin, kullanıcının adını kullanacağımı biliyorsam.

$name = 'Some dynamic name';

Ve bu durumda kullanmak için birden fazla mesajınız olsun. (Yani, engelleme veya başka bir kullanıcıyı izleme)

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

Kullanıcıya bir şeyler yapan genel bir işlev oluşturabilir ve bu dizeyi ekleyebilirsiniz ve cümlenin yapısı ne olursa olsun oldukça güzel görünmelidir. Her zaman sadece dizeleri bir araya getirmeyi ve sürekli olarak nokta gösterimini kullanmayı ve bir cümlenin iyi görünmesini sağlamak için dizeleri kapatıp tekrar açmayı sevmiyorum. Ben en başta ilk başta bir hayranıydım ama birden fazla dizenin manipüle edilmesi gerektiğinde ve her seferinde değişkenin yerleşimini sabit kodlamak istemediğinizde bu oldukça yararlı görünüyor.

Düşünün, daha iyi görünen ne?

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

Veya

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

Tabii ki ekstra bir adım, ancak koşullu denetimleriniz bir sürü başka işlevsel şey yaparsa, alıntılar ve ekleme işlevsel olarak kodlama yoluna girmeye başlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.