首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 字串輸出四大函式完整比較:echo、print、printf、sprintf 效能與格式化差異

     編輯:PHP 綜合知識

函式對照表

函式回傳值參數數量格式化支援效能適用場景
echo無 (void)多個 (逗號分隔)無最快一般輸出、多字串連接
print1 (int)單一無稍慢需在表達式中輸出
printf輸出長度 (int)格式字串 + 多參數完整 (C 風格)中等格式化輸出、數字對齊
sprintf格式化字串格式字串 + 多參數完整 (C 風格)中等字串組裝、日誌、SQL 產生

1. echo - 最常用、效能最佳

<?php
$str = "<b>粗體文字</b>";

echo $str;                    // 直接輸出變數
echo "<br/>";
echo $str, "<br/>", "另一段"; // 多參數逗號分隔 (比點號快)
echo "<br/>";

// echo 是語言結構,非函式,不可用於表達式
// $result = echo "test"; // Parse Error
?>

2. print - 可用於表達式

<?php
$str = "<b>粗體文字</b>";

print $str;                   // 輸出
print "<br/>";

// 可用於表達式
$success = print "輸出成功"; // $success = 1
$val = 10;
print ($val > 5) ? "大於5" : "小於等於5"; // 三元運算式中使用
?>

3. printf - 格式化直接輸出

<?php
$num = 23.123456;

// 常用格式碼
printf("整數: %d<br/>", $num);                    // 23
printf("浮點數: %f<br/>", $num);                  // 23.123456
printf("兩位小數: %.2f<br/>", $num);              // 23.12
printf("科學記號 (小寫): %e<br/>", $num);          // 2.312346e+1
printf("科學記號 (大寫): %E<br/>", $num);          // 2.312346E+1
printf("十六進位 (小寫): %x<br/>", 255);           // ff
printf("十六進位 (大寫): %X<br/>", 255);           // FF
printf("八進位: %o<br/>", 255);                   // 377
printf("字元: %c<br/>", 65);                       // A
printf("字串: %s<br/>", "Hello");                 // Hello
printf("百分號: %%<br/>");                         // %

// 參數編號與交換順序 (PHP 4.0.6+)
$name = "Tom"; $age = 20;
printf("姓名: %2\$s, 年齡: %1\$d<br/>", $age, $name); // 姓名: Tom, 年齡: 20

// 寬度與對齊
printf("'%10s'<br/>", "hi");      // 右對齊 (預設)
printf("'%-10s'<br/>", "hi");     // 左對齊
printf("'%05d'<br/>", 42);       // 零填充: 00042
?>

4. sprintf - 格式化回傳字串 (不直接輸出)

<?php
$name = "Tom";
$age = 20;
$price = 123.456;

// 組裝字串
$sql = sprintf(
    "INSERT INTO users (name, age, balance) VALUES ('%s', %d, %.2f)",
    $name, $age, $price
);
// $sql = "INSERT INTO users (name, age, balance) VALUES ('Tom', 20, 123.46)"

// 日誌格式化
$log = sprintf(
    "[%s] %s: %s (IP: %s)",
    date('Y-m-d H:i:s'),
    'LOGIN',
    $name,
    $_SERVER['REMOTE_ADDR'] ?? 'CLI'
);

// 多語言模板 (參數編號固定順序)
$templates = [
    'en' => 'Hello %1$s, you have %2$d messages.',
    'zh' => '%1$s 你好,您有 %2$d 則訊息。',
];
$lang = 'zh';
echo sprintf($templates[$lang], $name, 5); // Tom 你好,您有 5 則訊息。
?>

格式化碼完整參考

碼說明範例輸入範例輸出
%百分號-%
b二進位101010
cASCII 字元65A
d有號十進位-42-42
e/E科學記號123.451.234500e+2
u無號十進位4242
f/F浮點數 (locale aware/unaware)3.143.140000
g/G較短的 e/f 或 E/F1.21.2
o八進位255377
s字串hellohello
x/X十六進位 (小寫/大寫)255ff/FF

效能測試參考 (百萬次迴圈)

<?php
$n = 1000000;
$str = "test";

$t = microtime(true);
for ($i=0;$i<$n;$i++) echo $str;
echo "echo: " . (microtime(true)-$t) . "s\n";      // ~0.15s

$t = microtime(true);
for ($i=0;$i<$n;$i++) print $str;
echo "print: " . (microtime(true)-$t) . "s\n";     // ~0.18s

$t = microtime(true);
for ($i=0;$i<$n;$i++) printf("%s", $str);
echo "printf: " . (microtime(true)-$t) . "s\n";    // ~0.45s

$t = microtime(true);
for ($i=0;$i<$n;$i++) sprintf("%s", $str);
echo "sprintf: " . (microtime(true)-$t) . "s\n";   // ~0.40s
?>

結論:大量輸出用 `echo` (逗號分隔);需格式化用 `sprintf` 組裝後再 `echo`;避免迴圈中直接 `printf`。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved