PHP echo/print
两种输出的差别、`print_r`/`var_dump`、以及格式化输出。
Key Points`echo` 无返回值、可接多参数;`print` 返回 1,本质是表达式。
echo 与 print
PHP
<?php
echo "hello", " ", "world", "\n"; // 多参数
print "print 也能用\n";
// print 有返回值,所以能用在表达式里
$result = print "返回值是 1\n";
echo $result, "\n";
// echo 没有返回值
// $r = echo "x"; // 语法错误Output
hello world
print 也能用
返回值是 1
1| Aspect | echo | |
|---|---|---|
| 参数个数 | 多个 | 一个 |
| 返回值 | 无 | 1 |
| 能否用于表达式 | 不能 | 能 |
| 速度 | 略快 | 略慢 |
In practice echo far outnumbers print. printf/sprintf handle formatting; var_dump and print_r are for debugging.
字符串里的变量
PHP
<?php
$name = "张三";
$arr = ["a" => 1];
echo "你好,$name\n"; // 双引号解析变量
echo "你好,{$name}\n"; // 花括号明确边界
echo '你好,$name\n'; // 单引号不解析,\n 也不转义
// 数组元素必须用花括号
echo "值:{$arr['a']}\n";
// 对象属性
$obj = new stdClass();
$obj->title = "标题";
echo "标题:{$obj->title}\n";Output
你好,张三
你好,张三
你好,$name\n
值:1
标题:标题Single quotes neither interpolate nor process escapes (except
\' and \\). Use single quotes for plain text, double for interpolation. Array subscripts inside double quotes must be wrapped in {}.调试输出
PHP
<?php
$data = [
"name" => "张三",
"tags" => ["vip", "new"],
"age" => 28,
];
print_r($data);
echo "\n";
var_dump($data["age"], $data["tags"]);
echo "\n";
var_export($data["tags"]);
echo "\n";Output
Array
(
[name] => 张三
[tags] => Array
(
[0] => vip
[1] => new
)
[age] => 28
)
int(28)
array(2) {
[0]=>
string(3) "vip"
[1]=>
string(3) "new"
}
array (
0 => 'vip',
1 => 'new',
)| Function | Shows type | Output format |
|---|---|---|
echo | 否 | 原样 |
print_r | 否 | 人类可读,适合看结构 |
var_dump | 是 | 类型 + 长度 + 值 |
var_export | 部分 | 合法 PHP 代码 |
格式化
PHP
<?php
printf("%s 今年 %d 岁,身高 %.1f 米\n", "张三", 28, 1.75);
$s = sprintf("%05d", 42);
echo $s, "\n";
echo number_format(1234567.891, 2), "\n";
echo str_pad("42", 5, "0", STR_PAD_LEFT), "\n";Output
张三 今年 28 岁,身高 1.8 米
00042
1,234,567.89
00042printf placeholders match C: %s, %d, %f, %05d zero-padded, %.2f two decimals. number_format is the standard for money.
echo 与 print
PHP
<?php
echo "hello", " ", "world", "\n"; // 多参数
print "print 也能用\n";
// print 有返回值,所以能用在表达式里
$result = print "返回值是 1\n";
echo $result, "\n";
// echo 没有返回值
// $r = echo "x"; // 语法错误Output
hello world
print 也能用
返回值是 1
1| 对比项 | echo | |
|---|---|---|
| 参数个数 | 多个 | 一个 |
| 返回值 | 无 | 1 |
| 能否用于表达式 | 不能 | 能 |
| 速度 | 略快 | 略慢 |
实际开发里 echo 用得远多于 print。printf 和 sprintf 用于格式化,var_dump 和 print_r 用于调试。
字符串里的变量
PHP
<?php
$name = "张三";
$arr = ["a" => 1];
echo "你好,$name\n"; // 双引号解析变量
echo "你好,{$name}\n"; // 花括号明确边界
echo '你好,$name\n'; // 单引号不解析,\n 也不转义
// 数组元素必须用花括号
echo "值:{$arr['a']}\n";
// 对象属性
$obj = new stdClass();
$obj->title = "标题";
echo "标题:{$obj->title}\n";Output
你好,张三
你好,张三
你好,$name\n
值:1
标题:标题单引号不解析变量也不处理转义(除了
\' 和 \\)。所以纯文本用单引号更快,需要插值时用双引号。数组下标在双引号里必须用 {} 包起来,否则解析出错。调试输出
PHP
<?php
$data = [
"name" => "张三",
"tags" => ["vip", "new"],
"age" => 28,
];
print_r($data);
echo "\n";
var_dump($data["age"], $data["tags"]);
echo "\n";
var_export($data["tags"]);
echo "\n";Output
Array
(
[name] => 张三
[tags] => Array
(
[0] => vip
[1] => new
)
[age] => 28
)
int(28)
array(2) {
[0]=>
string(3) "vip"
[1]=>
string(3) "new"
}
array (
0 => 'vip',
1 => 'new',
)| 函数 | 显示类型 | 输出格式 |
|---|---|---|
echo | 否 | 原样 |
print_r | 否 | 人类可读,适合看结构 |
var_dump | 是 | 类型 + 长度 + 值 |
var_export | 部分 | 合法 PHP 代码 |
格式化
PHP
<?php
printf("%s 今年 %d 岁,身高 %.1f 米\n", "张三", 28, 1.75);
$s = sprintf("%05d", 42);
echo $s, "\n";
echo number_format(1234567.891, 2), "\n";
echo str_pad("42", 5, "0", STR_PAD_LEFT), "\n";Output
张三 今年 28 岁,身高 1.8 米
00042
1,234,567.89
00042printf 的占位符和 C 一样:%s 字符串、%d 整数、%f 浮点、%05d 补零、%.2f 两位小数。number_format 是金额格式化的标准做法。