函式對照表
| 函式 | 回傳值 | 參數數量 | 格式化支援 | 效能 | 適用場景 |
| echo | 無 (void) | 多個 (逗號分隔) | 無 | 最快 | 一般輸出、多字串連接 |
| print | 1 (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 | 二進位 | 10 | 1010 |
| c | ASCII 字元 | 65 | A |
| d | 有號十進位 | -42 | -42 |
| e/E | 科學記號 | 123.45 | 1.234500e+2 |
| u | 無號十進位 | 42 | 42 |
| f/F | 浮點數 (locale aware/unaware) | 3.14 | 3.140000 |
| g/G | 較短的 e/f 或 E/F | 1.2 | 1.2 |
| o | 八進位 | 255 | 377 |
| s | 字串 | hello | hello |
| x/X | 十六進位 (小寫/大寫) | 255 | ff/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`。