主题
echo 与 print
PHP 里最常用的输出方式就是 echo 和 print。两者都能把内容写到页面或终端,日常开发几乎总是用 echo。
先看一段能直接跑的代码,保存为 hello.php 后执行 php hello.php:
php
<?php
echo "Hello, PHP\n";
print "Hello again\n";输出:
Hello, PHP
Hello again它们是什么
echo 和 print 都是语言结构(language construct),不是函数。所以:
- 括号可以省略
- 不能当普通函数那样取返回值来「组成表达式」(
echo尤其如此) - 手册里写成
echo、print,而不是echo()、print()
php
<?php
echo "不带括号\n";
echo("带括号也可以\n");
print "不带括号\n";
print("带括号也可以\n");echo
echo 用来输出一个或多个字符串,没有返回值。
基本用法
php
<?php
echo "PHP Guide";
echo 8;
echo true; // 输出 1
echo false; // 什么也不输出布尔值 true 会被输出成 1,false 输出空字符串。需要看清真实类型时,用 var_dump(),不要用 echo。
一次输出多项
echo 可以用逗号分隔多个参数,会按顺序拼在一起输出:
php
<?php
$lang = "PHP";
$year = 1995;
echo $lang, " 诞生于 ", $year, " 年\n";输出:
PHP 诞生于 1995 年这是 echo 相对 print 最明显的能力:print 只能接收一个参数。
不要给多个参数加括号
下面这种写法会报错,因为加上括号后,PHP 会把它当成「一次函数调用」:
php
<?php
echo("PHP", "Guide"); // 语法错误多项输出时,不要加括号:
php
<?php
echo "PHP", "Guide"; // 正确
echo ("PHP"), ("Guide"); // 也能跑,但不要这样写print
print 同样用于输出,但有两点和 echo 不同:
- 只能接收一个参数
- 总会返回
1,因此可以出现在表达式里
php
<?php
print "只输出一句话\n";
$result = print "这行也会输出\n";
var_dump($result); // int(1)因为有返回值,下面这种「顺便输出」的写法在语法上合法,实际项目里几乎不会这么用:
php
<?php
$ok = true;
$ok && print "条件成立才输出\n";echo 没有返回值,不能这样写。
对照表
echo | print | |
|---|---|---|
| 类型 | 语言结构 | 语言结构 |
| 参数个数 | 一个或多个 | 只能一个 |
| 返回值 | 无 | 始终为 1 |
| 能否用在表达式中 | 不能 | 能 |
| 日常推荐 | 是 | 一般不需要 |
性能差异可以忽略。选择哪个,看的是写法和习惯,不是速度。
短回显标签 <?=
在 HTML 模板里输出变量,推荐用短回显标签。它等价于 echo,从 PHP 5.4 起始终可用:
php
<?php
$title = "PHP 基础学习指南";
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title><?= htmlspecialchars($title, ENT_QUOTES, 'UTF-8') ?></title>
</head>
<body>
<h1><?= htmlspecialchars($title, ENT_QUOTES, 'UTF-8') ?></h1>
</body>
</html>注意:把变量输出到 HTML 时,要做转义(上面的 htmlspecialchars),避免 XSS。命令行脚本不必转义。
和 HTML 混写
PHP 文件可以在 HTML 中间插入输出。下面是典型写法:
php
<?php $name = "小明"; ?>
<p>你好,<?= htmlspecialchars($name, ENT_QUOTES, 'UTF-8') ?></p>
<?php if ($name !== ""): ?>
<p>欢迎回来。</p>
<?php endif; ?>纯逻辑脚本(没有 HTML)里,用 echo "...\n" 或 echo PHP_EOL 换行即可。
输出变量与字符串
把变量和文字拼在一起,常见有三种方式。
1. 点号拼接
php
<?php
$name = "PHP";
echo "Hello, " . $name . "\n";单引号字符串不会解析变量,适合输出原样文本:
php
<?php
$name = "PHP";
echo 'Hello, $name\n'; // 原样输出 Hello, $name\n2. 双引号插值
双引号字符串会解析变量和转义字符:
php
<?php
$name = "PHP";
echo "Hello, $name\n";
echo "Hello, {$name} Guide\n";变量紧贴其他字符时,用 {$name} 更不容易出错。
3. 逗号传给 echo
php
<?php
$name = "PHP";
echo "Hello, ", $name, "\n";三种都能用。本指南后续示例以双引号插值和点号拼接为主。
和 var_dump、print_r 的区别
| 结构 / 函数 | 用途 |
|---|---|
echo / print | 把值作为文本输出给用户 |
var_dump() | 调试:看类型和值,数组、对象也能看清 |
print_r() | 调试:把数组、对象打印得比较可读 |
php
<?php
$user = ["name" => "小明", "age" => 18];
echo $user; // 只会输出 Array,看不清内容
print_r($user); // 可读地打印数组
var_dump($user); // 连类型一起打印给用户看的内容用 echo;排查问题时用 var_dump()。
常见误区
把 echo 的结果赋给变量。 echo 没有返回值,这样写是错的:
php
<?php
$text = echo "hello"; // 语法错误需要「得到字符串」而不是「立刻输出」时,用拼接或 sprintf():
php
<?php
$text = "hello";
$line = sprintf("你好,%s\n", $text);
echo $line;在括号里给 echo 传多个参数。 echo("a", "b") 会语法错误,应写成 echo "a", "b"。
用 echo 检查空值。 echo false;、echo null; 都什么也不显示,看起来像没执行。判断变量请用 isset()、empty() 或 var_dump(),详见 内置函数。
在 HTML 里直接 echo 用户输入。 未转义的输出可能造成 XSS。页面输出用 htmlspecialchars()。
该用哪一个
- 日常输出:用
echo - 模板里输出变量:用
<?= ... ?> - 调试复杂数据:用
var_dump() print能做的,echo几乎都能做,没有必要特意选print
练习
- 写一个
intro.php,用echo输出你的名字和今天想学的内容,各占一行。 - 把同一段内容改成
print输出,确认结果一致。 - 用一次
echo、逗号分隔,输出语言:PHP(其中PHP来自变量)。 - 新建一个简单 HTML 页面,用
<?= ?>输出标题。
下一篇:变量定义 — 学会把数据存起来再输出。