Tại sao nên sử dụng hàm sprintf trong PHP?


188

Tôi đang cố gắng tìm hiểu thêm về hàm PHP sprintf () nhưng php.net không giúp tôi nhiều vì tôi vẫn còn bối rối, tại sao bạn lại muốn sử dụng nó?

Hãy xem ví dụ của tôi dưới đây.

Tại sao nên sử dụng cái này:

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

Khi điều này làm tương tự và dễ dàng hơn để viết IMO:

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

Am i thiếu cái gì ở đây?


40
+1, câu hỏi hay. Tôi hiếm khi sử dụng nó cho bản thân mình, vì vậy tôi rất thích xem câu trả lời.
zombat

6
Lưu ý rằng hai ví dụ của bạn không tương đương: ví dụ thứ nhất chỉ gán kết quả cho $output, trong khi ví dụ thứ hai echolà nó.
Daniel Pryden

Cá nhân tôi sử dụng nó khi tôi đang kết hợp nhiều thứ. Nó chỉ thực sự sau đó tôi thấy nó hữu ích, chủ yếu để dễ đọc.
AlexMorley-Finch

Câu trả lời:


130

sprintf có tất cả các khả năng định dạng của printf gốc, điều đó có nghĩa là bạn có thể làm được nhiều hơn là chỉ chèn các giá trị biến trong chuỗi.

Ví dụ: chỉ định định dạng số (hex, thập phân, bát phân), số thập phân, phần đệm và hơn thế nữa. Google cho printf và bạn sẽ tìm thấy rất nhiều ví dụ. Các bài viết trên wikipedia printf nên giúp bạn bắt đầu.


46
Nhiều năm trước tôi đã viết một hàm đẹp cho các số không đệm. Được sử dụng cho các lứa tuổi trước khi nhận ra tôi có thể làm một cách đơn giảnsprintf('%03d', $num)
DisgruntledGoat

5
PHP sprintf có tất cả các khả năng định dạng ... thực sự đang thiếu một thứ quan trọng, %,8dví dụ, để có được số nguyên 8 chữ số và dấu phẩy được phân tách đúng. Sử dụng number_formatlà ít thuận tiện trong một printfphong cách.
e2-e4

3
@DisgruntledGoat Bạn có thể chia nhỏ chuỗi định dạng đó ('% 03d') không? Tôi nghĩ rằng nó sẽ thực sự hữu ích. Cảm ơn.
Ông Smee

3
Bạn cũng có thể lặp lại và sắp xếp lại các đối số để hiển thị. ví dụ: sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');kết quả làHello World, my name is also World.
fyrye

77

Có nhiều trường hợp sử dụng cho sprintf nhưng một cách mà tôi sử dụng chúng là lưu trữ một chuỗi như thế này: 'Xin chào, Tên tôi là% s' trong cơ sở dữ liệu hoặc là một hằng số trong lớp PHP. Theo cách đó khi tôi muốn sử dụng chuỗi đó, tôi có thể chỉ cần làm điều này:

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

Về cơ bản nó cho phép một số phân tách trong mã. Nếu tôi sử dụng 'Xin chào, Tên tôi là% s' ở nhiều nơi trong mã của tôi, tôi có thể đổi nó thành '% s là tên của tôi' ở một nơi và nó cập nhật ở mọi nơi khác một cách tự động, mà không cần phải đi đến từng trường hợp và di chuyển xung quanh ghép nối.


8
Điều này. Bây giờ thêm các đối số và bản dịch được đánh số:]
Konerak

46

Một cách sử dụng khác sprintflà trong các ứng dụng được bản địa hóa làm đối số chosprintf không phải theo thứ tự chúng xuất hiện trong chuỗi định dạng.

Thí dụ:

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

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

Nhưng một ngôn ngữ như tiếng Pháp ra lệnh cho các từ khác nhau:

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

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

(Vâng, tiếng Pháp của tôi thật tệ: Tôi đã học tiếng Đức ở trường!)

Trong thực tế, bạn sẽ sử dụng gettext để lưu trữ các chuỗi được bản địa hóa nhưng bạn có ý tưởng.



37

Nó dễ dịch hơn.

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

Các chuỗi dịch (gettext) hiện là:

  • Đây là kết quả:
  • cho ngày này

Khi được dịch sang một số ngôn ngữ khác, điều đó có thể là không thể hoặc dẫn đến những câu rất kỳ lạ.

Bây giờ nếu bạn có

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

Các chuỗi dịch (gettext) hiện là:

  • Đây là kết quả:% s cho ngày này% s

Điều này có ý nghĩa hơn nhiều và nó linh hoạt hơn nhiều để dịch sang các ngôn ngữ khác


1
Tôi thấy nơi này sẽ rất hữu ích +1
JasonDavis

6
Mặc dù đối với các bản dịch, có lẽ tốt hơn là sử dụng các công cụ xác định vị trí, để cho phép linh hoạt hơn khi dịch, tức là: echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);Điều đó sẽ cho phép bản dịch sửa đổi cụm từ nhưFor the date %2$s, the result is %1$s
PatrikAkerstrand

1
Mặc dù ngay cả khi chúng không có trong chuỗi gốc, bạn có thể đặt chúng vào bản dịch và chúng sẽ hoạt động.
quang phổ

17

Lý do tốt nhất mà tôi đã tìm thấy là nó cho phép bạn đặt tất cả các chuỗi ngôn ngữ trong tệp ngôn ngữ của mình là mọi người có thể dịch và đặt hàng chúng khi cần - tuy nhiên bạn vẫn biết rằng dù chuỗi đó ở định dạng nào - bạn muốn hiển thị tên người dùng.

Ví dụ: trang web của bạn sẽ nói "Chào mừng trở lại [[Người dùng]]" ở đầu trang. Là lập trình viên mà bạn không biết hoặc không quan tâm đến việc các anh chàng UI sẽ viết như thế nào - bạn chỉ cần biết rằng tên người dùng sẽ được hiển thị ở đâu đó trong tin nhắn.

Vì vậy, bạn có thể nhúng tin nhắn vào mã của mình mà không phải lo lắng về thông điệp đó thực sự là gì.

Tệp Lang (EN_US):

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

Sau đó, bạn có thể hỗ trợ bất kỳ loại tin nhắn bằng bất kỳ ngôn ngữ nào bằng cách sử dụng mã này trong mã php thực tế của bạn.

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

Tôi chưa bao giờ phải lo lắng về việc thực hiện các tệp ngôn ngữ nhưng điều này có vẻ như là một trong những cách sử dụng hữu ích nhất đối với tôi
JasonDavis

Ví dụ này cũng có ý nghĩa hoàn hảo với tôi vì tôi chưa thực hiện nhiều ứng dụng đa cấp.
Giải pháp web MKN

9

Tại sao bạn muốn sử dụng nó?

Nó chứng tỏ rất hữu ích khi sử dụng nguồn (bên ngoài) cho các chuỗi ngôn ngữ. Nếu bạn cần một số lượng biến cố định trong một chuỗi đa ngôn ngữ nhất định, bạn chỉ cần biết thứ tự chính xác:

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

Các biến được chèn thậm chí không phải ở đầu hoặc cuối trên nhiều ngôn ngữ, chỉ có vấn đề đặt hàng của chúng.

Tất nhiên, bạn có thể viết chức năng của riêng mình để thực hiện thay thế này, chắc chắn ngay cả với một số tăng hiệu suất nhỏ, nhưng nó nhanh hơn nhiều (Language chỉ cần bạn có một lớp để đọc các chuỗi ngôn ngữ) :

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

Nó cũng đi kèm với các khả năng đầy đủ của printf, do đó, cũng là một lớp lót để định dạng nhiều loại biến, ví dụ:


8

Như đã đề cập, nó cho phép định dạng dữ liệu đầu vào. Ví dụ: buộc các số 2dp, 4 chữ số, v.v ... Nó khá hữu ích để xây dựng chuỗi truy vấn MySQL.

Một ưu điểm khác là nó cho phép bạn tách biệt bố cục của chuỗi khỏi dữ liệu được đưa vào nó, gần giống như cho ăn trong các thông số. Ví dụ: trong trường hợp truy vấn 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);

Phương pháp này tất nhiên có những cách sử dụng khác, chẳng hạn như khi in đầu ra dưới dạng HTML, v.v.

Chỉnh sửa: Vì lý do bảo mật , khi sử dụng một kỹ thuật như trên, bạn phải vệ sinh tất cả các biến đầu vào mysql_real_escape_string()trước khi sử dụng phương pháp này , để ngăn chặn các cuộc tấn công chèn MySQL. Nếu bạn phân tích cú pháp đầu vào không được xác nhận, trang web và máy chủ của bạn sẽ bị hack . (Tất nhiên, ngoại trừ, các biến đã được xây dựng hoàn toàn bởi mã của bạn và được đảm bảo an toàn.)


2
Mã đó dễ bị tấn công SQL. Sử dụng giữ chỗ, không phải nội suy truy vấn!
duskwuff -inactive-

@duskwuff - Được sử dụng như là, bạn đúng. Xin lỗi, tôi đã sửa đổi câu trả lời của mình.
Samuel Jaeschke

7

Sử dụng sprintf () sẽ sạch hơn và an toàn hơn để định dạng chuỗi của bạn.

Ví dụ: khi bạn đang xử lý các biến đầu vào, nó sẽ ngăn chặn những bất ngờ không mong muốn bằng cách chỉ định trước định dạng dự kiến ​​(ví dụ: bạn đang mong đợi chuỗi [ %s] hoặc số [ %d]). Điều này có khả năng giúp giảm nguy cơ SQL SQL , nhưng sẽ không ngăn được nếu chuỗi bao gồm dấu ngoặc kép.

Nó cũng giúp xử lý các float, bạn có thể chỉ định rõ ràng độ chính xác của chữ số (ví dụ %.2f) giúp bạn tiết kiệm khi sử dụng các hàm chuyển đổi.

Ưu điểm khác là hầu hết các ngôn ngữ lập trình chính đều có cách triển khai riêng sprintf() , vì vậy khi bạn đã quen với nó, việc sử dụng nó sẽ dễ dàng hơn, thay vì học một ngôn ngữ mới (như cách nối chuỗi hoặc chuyển đổi phao).

Tóm lại, đó là một cách thực hành tốt để sử dụng để có mã dễ đọc và dễ đọc hơn.

Ví dụ, xem ví dụ thực tế dưới đây :

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

Hoặc một số ví dụ đơn giản mà in, ví dụ '1','2','3','4':

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

và in với chuỗi định dạng:

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

nơi printf()tương đương vớisprintf() , nhưng nó đưa ra một chuỗi được định dạng thay vì trả về nó (cho biến).

Cái nào dễ đọc hơn?


1
Tôi không đồng ý nhưng cũng đáng nói tôi đã hỏi điều này 6-7 năm trước và nghĩ lại tôi không thể nhớ lại một lần rằng tôi đã sử dụng nó từ đó! Tôi hy vọng sẽ tìm thấy một nơi cho nó một ngày nào đó và tin rằng nó có một nơi nhưng buồn cười khi nghĩ rằng tôi đã không sử dụng nó kể từ khi hỏi câu hỏi này nhiều năm trước!
JasonDavis

Tôi có thể nói rằng nó hơi giống với việc đặt các biến cho PDO trong PHP. Ngoài ra nếu bạn muốn cung cấp cho nó đối số dễ đọc, thì trong trường hợp đó, tôi thích sử dụng sprintf()chia thành nhiều dòng trong đó chuỗi có trình giữ chỗ nằm trên 1 dòng và các giá trị nằm trên một dòng hoặc thậm chí nhiều dòng bên dưới nó, tất cả đều được thụt lề chính xác khóa học. Sử dụng bản demo của bạn theo cách tôi đã mô tả ... i.imgur.com/DFi3ur8.png
JasonDavis

Báo cáo chuẩn bị kết hợp với các thủ tục được lưu trữ là cách tốt nhất để ngăn ngừa tiêm sql, không chạy nước rút. Bạn vẫn có thể dễ dàng tiêm sql bằng cách sử dụng sprintf, nếu chuỗi xảy ra có chứa một trích dẫn
HumbleWebDev

4

Ngay cả tôi mặc dù điều tương tự trừ khi tôi sử dụng nó gần đây. Khi bạn tạo tài liệu dựa trên đầu vào của người dùng, điều này sẽ có ích.

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

Những gì có thể dễ dàng được viết là

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

Hoặc bạn có thể làm điều này : "<p>Some big paragraph {$a['name']} more words {$a['age']}</p>". TUY NHIÊN, KHÔNG QUÊN để vệ sinh đầu vào của người dùng hoặc bạn mở mã của mình lên đến các lỗ hổng XSS.
thứ ba

Bạn cũng có thể sử dụng cú pháp HEREDOC . Theo tôi, cả hai đều dễ đọc hơn cú pháp sprintf.
thứ ba

4

Điều này:

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

Cũng có thể được viết:

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

Theo ý kiến ​​của tôi, điều này rõ ràng hơn để đọc, nhưng tôi có thể thấy việc sử dụng để bản địa hóa hoặc định dạng.


3

Một số trường hợp điển hình là nơi bạn cần kiểm soát chính xác hơn định dạng đầu ra. Chẳng hạn, có thể khó để đảm bảo một giá trị cụ thể có lượng không gian cụ thể được đệm ở phía trước, tùy thuộc vào độ dài của nó hoặc một số được xuất ra theo một định dạng chính xác cụ thể.

Có rất nhiều ví dụ trong hướng dẫn PHP

Ngoài ra những gì đến với ví dụ của bạn về "dễ viết hơn" .. Trong khi tiếng vang có thể dễ viết hơn, sprintf dễ đọc hơn, đặc biệt nếu bạn có nhiều biến.

Một lý do khác để sử dụng sprintf hoặc printf có thể là bạn muốn cho phép người dùng xác định định dạng đầu ra của một số giá trị - bạn có thể cho phép họ xác định định dạng đầu ra tương thích sprintf một cách an toàn.

Oh, và ví dụ của bạn thực sự sai cho một phần. sprintftrả về chuỗi, nhưng echokhông - echongay lập tức xuất ra chuỗi và không trả về gì, trong khi sprintfchỉ trả về chuỗi .


3
  1. Nếu bạn đã sử dụng C / C ++, thì bạn sẽ được sử dụng chức năng sprintf.

  2. Có một cơ hội tốt là dòng thứ hai kém hiệu quả hơn. Echo được thiết kế như một lệnh đầu ra, trong khi sprintf được thiết kế để thực hiện thay thế mã thông báo chuỗi. Tôi không phải là người PHP, nhưng tôi nghi ngờ rằng có nhiều đối tượng liên quan đến tiếng vang. Nếu nó hoạt động như Java, nó sẽ tạo ra một chuỗi mới mỗi khi một cái gì đó được thêm vào danh sách, vì vậy bạn sẽ kết thúc với 4 chuỗi được tạo.


Các phiên bản gần đây của Java sẽ chuyển đổi nối chuỗi thành một StringBuilder đằng sau hậu trường.
RodeoClown

1
Chuỗi trong PHP không phải là đối tượng. Ví dụ thứ hai sử dụng cấu trúc ngôn ngữ thay vì gọi hàm nên sẽ nhanh hơn không thể nhận ra.
Tamlyn

3

Đôi khi tôi nhận được một cái gì đó như thế này, mà tôi cho rằng dễ đọc hơn một chút:

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

3

Tôi thường sử dụng sprintf để đảm bảo rằng một id đến từ đầu vào của người dùng là một số nguyên chẳng hạn:

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

Cũng được sử dụng để làm các mẫu thô sơ (đối với thư html hoặc những thứ khác), vì vậy bạn có thể sử dụng lại mẫu ở nhiều nơi:

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

Nó cũng rất hữu ích để định dạng số trong các biểu diễn khác nhau (bát phân, kiểm soát vị trí thập phân, v.v.).


Không dễ dàng hơn khi chỉ sử dụng intval ($ _ GET ["article_id"])? Chà, thực ra nó đã gõ nhiều hơn ... * ghi chú lại phương pháp của bạn "Dag
nợi

Đối với loại mã này, tốt hơn nên sử dụng mysql_real_escape_opes (): $ query = sprintf ("SELECT * từ các bài viết trong đó id =% d;", ​​mysql_real_escape_opes ($ _ 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 đặc biệt hữu ích khi định dạng chuỗi sử dụng số. Ví dụ,

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

Output: There are -2 oranges in the basket

Cam được định dạng dưới dạng một số nguyên (-2), nhưng sẽ bao quanh các số dương nếu người ta sử dụng% u cho các giá trị không dấu. Để tránh hành vi này, tôi sử dụng hàm tuyệt đối, abs (), để làm tròn số về 0 như sau:

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

Output: There are 5 oranges in the basket

Kết quả cuối cùng là một tuyên bố có khả năng đọc cao, xây dựng logic, định dạng rõ ràng và linh hoạt để thêm các biến bổ sung theo yêu cầu. Khi số lượng biến tăng kết hợp với các hàm thao túng các biến này, lợi ích sẽ trở nên rõ ràng hơn. Như một ví dụ cuối cùng:

$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

Phía bên trái của câu lệnh sprintf thể hiện rõ ràng chuỗi và các loại giá trị dự kiến, trong khi phía bên phải thể hiện rõ ràng các biến được sử dụng và cách chúng được thao tác.


Tôi chuẩn bị nâng cao câu trả lời của bạn cho câu đầu tiên tuyệt vời của nó ( "sprintf đặc biệt hữu ích khi định dạng chuỗi sử dụng số" ), đây thực sự là điểm quan trọng nhất sprintftrong PHP, nhưng sau đó nhìn thấy những ví dụ phức tạp đó tạo ra hoa quả từ "mất tích" trái cây :), mỗi lần chỉ hiển thị %d(và abs(), đó là không thích hợp cho chủ đề này), thay vì hiển thị một số lượng lớn các định dạng số tùy chọn (trong đó sẽ có liên quan), tôi đã thay đổi tâm trí của tôi. Nhưng nếu bạn cập nhật câu trả lời, tôi vẫn sẽ có upvote của tôi trong tủ lạnh cho bạn. :) Thx, chúc mừng!
Sz.

3

Vâng, sprintf có nhiều khả năng như chúng ta biết một ví dụ như dưới đây:

Vài tháng trước tôi có nhu cầu chuyển đổi định dạng giây sang giờ: phút: giây $t = 494050 //secondsTôi muốn in như 137 h 14 m 10 svậy nên tôi đã đưa ra chức năng php springf()tôi chỉ giữ giây trong $techo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);đưa cho tôi137 h 14 m 10 s

Hàm sprintf () rất hữu ích nếu chúng ta biết cách sử dụng nó.


2

Đối số là cùng một đối với việc sử dụng các mẫu. Bạn sẽ muốn tách Textsleev của bạn khỏi các giá trị biến thực tế. Bên cạnh sức mạnh bổ sung của chạy nước rút mà chúng tôi đã đề cập về nó chỉ là một phong cách.


2

Một trường hợp sử dụng thực sự tốt để sử dụng sprintf là xuất ra các định dạng đệm của các số và cả khi trộn các loại khác nhau trong một chuỗi. Nó có thể dễ đọc hơn trong nhiều trường hợp và làm cho nó cực kỳ đơn giản để in các biểu diễn khác nhau của cùng một biến, đặc biệt là các số.


2

Sử dụng hàm sprintf () so với phép nối thông thường có lợi thế là bạn có thể áp dụng các loại định dạng khác nhau trên các biến được nối.

Trong trường hợp của bạn, bạn có

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

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

Hãy để chúng tôi lấy $result = 'passed'; date = '23rd';

Sử dụng phép nối thông thường, bạn chỉ có thể nhận được đầu ra:

Here is the result: passed for this date 23rd

Tuy nhiên, nếu bạn sử dụng, sprintf()bạn có thể nhận được một đầu ra sửa đổi, chẳng hạn như:

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

Đầu ra:

Here is the result: pass for this date 23

2

sprintf()khá giống với printf(). Nếu bạn biết printf()chi tiết sau đó sprintf()và thậm chí vsprintf()không thực sự khó hiểu.

một trong những điều đó khác với sprintf()từ printf()là bạn sẽ không cần khai báo một biến để bắt đầu ra khỏi chức năng vì nó không trực tiếp in / echo bất cứ điều gì. Hãy xem đoạn mã sau:

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"

Mong rằng sẽ giúp.



0

Bạn phải cẩn thận khi sử dụng sprintf trong các vòng lặp:

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

Điều này dẫn đến những lần sau (trên máy cục bộ của tôi với PHP 7.2):

Vòng lặp: 10000000

'$ a. $ b. $ c. $ d. $ e. $ f 'cần 1.4507689476013s

"$ a $ b $ c $ d $ e $ f" cần 1.9958319664001s

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


0

Tôi sử dụng nó cho các tin nhắn cho người dùng hoặc các loại chức năng "đẹp" khác. Ví dụ, nếu tôi biết tôi sẽ sử dụng tên người dùng.

$name = 'Some dynamic name';

Và có nhiều tin nhắn để sử dụng trong tình huống đó. (Tức là, chặn hoặc theo dõi người dùng khác)

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

Bạn có thể tạo một hàm chung thực hiện một cái gì đó cho người dùng và thêm chuỗi này, và cho dù cấu trúc của câu đó trông như thế nào cũng khá đẹp. Tôi luôn không thích chỉ nối các chuỗi lại với nhau và liên tục sử dụng ký hiệu dấu chấm và đóng và mở lại chuỗi chỉ để làm cho một câu có vẻ tốt. Lúc đầu tôi là một người hâm mộ giống như hầu hết nhưng điều này có vẻ khá hữu ích khi nhiều chuỗi cần phải được thao tác và bạn không muốn mã hóa vị trí của biến trong mỗi lần.

Hãy nghĩ về nó, những gì có vẻ tốt hơn?

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

Hoặc là

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

Chắc chắn đó là một bước bổ sung nhưng nếu kiểm tra có điều kiện của bạn thực hiện một loạt các chức năng khác, thì các trích dẫn và nối thêm bắt đầu có được theo cách mã hóa theo chức năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.