echo

(PHP 4, PHP 5, PHP 7, PHP 8)

echo输出一个或多个字符串

描述

echo(string ...$expressions): void

输出一个或多个表达式,不添加额外的换行符或空格。

echo 不是一个函数,而是一个语言结构。它的参数是在 echo 关键字后面的表达式列表,用逗号隔开,不使用括号。与其他一些语言结构不同,echo 没有返回值,因此它不能在表达式的上下文中使用。

echo 还有一个快捷语法,您可以在开始标签后立即加一个等号。即使 short_open_tag 配置设置被禁用,此语法仍然可用。

我有 <?=$foo?> foo。

print 的主要区别是 echo 接受多个参数,并且没有返回值。

参数

expressions

一个或多个要输出的字符串表达式,用逗号隔开。即使 启用了 strict_types 指令,非字符串值也会被强制转换为字符串。

返回值

没有返回值。

示例

示例 #1 echo 示例

<?php
echo "echo 不需要括号.";

// 字符串可以分别作为多个参数传递,也可以
// 连接在一起作为单个参数传递
echo 'This ', 'string ', 'was ', 'made ', 'with multiple parameters.', "\n";
echo
'This ' . 'string ' . 'was ' . 'made ' . 'with concatenation.' . "\n";

// 不添加换行符或空格;下面输出 "helloworld" 都是在一行上
echo "hello";
echo
"world";

// 与上面相同
echo "hello", "world";

echo
"This string spans
multiple lines. The newlines will be
output as well"
;

echo
"This string spans\nmultiple lines. The newlines will be\noutput as well.";

// 参数可以是任何生成字符串的表达式
$foo = "example";
echo
"foo is $foo"; // foo is example

$fruits = ["lemon", "orange", "banana"];
echo
implode(" and ", $fruits); // lemon and orange and banana

// 非字符串表达式将被强制转换为字符串,即使使用 declare(strict_types=1) 也一样
echo 6 * 7; // 42

// 因为 echo 不像表达式,所以以下代码无效。
($some_var) ? echo 'true' : echo 'false';

// 但是,以下示例将起作用:
($some_var) ? print 'true' : print 'false'; // print 也是一个结构,但
// 它是一个有效的表达式,返回 1,
// 所以它可以在这种情况下使用。

echo $some_var ? 'true': 'false'; // 首先计算表达式,然后将其传递给 echo
?>

注释

注意: 因为这是一个语言结构,而不是一个函数,所以不能使用 可变函数命名参数 来调用它。

注意: 使用括号

echo 的单个参数用括号括起来不会引发语法错误,并且会生成看起来像普通函数调用的语法。但是,这可能会造成误解,因为括号实际上是输出的表达式的组成部分,而不是 echo 语法本身的一部分。

<?php
echo "hello";
// 输出 "hello"

echo("hello");
// 也输出 "hello",因为 ("hello") 是一个有效的表达式

echo(1 + 2) * 3;
// 输出 "9";括号导致 1+2 首先被计算,然后是 3*3
// echo 语句将整个表达式视为一个参数

echo "hello", " world";
// 输出 "hello world"

echo("hello"), (" world");
// 输出 "hello world";括号是每个表达式的组成部分

echo("hello", " world");
// 抛出解析错误,因为 ("hello", " world") 不是有效的表达式
?>

提示

将多个参数传递给 echo 可以避免由于 PHP 中连接运算符的优先级而产生的复杂情况。例如,连接运算符的优先级高于三元运算符,并且在 PHP 8.0.0 之前,它的优先级与加法和减法相同。

<?php
// 在下面,表达式 'Hello ' . isset($name) 首先被计算,
// 并且总是为真,所以传递给 echo 的参数始终是 $name
echo 'Hello ' . isset($name) ? $name : 'John Doe' . '!';

// 预期的行为需要额外的括号
echo 'Hello ' . (isset($name) ? $name : 'John Doe') . '!';

// 在 PHP 8.0.0 之前,下面输出 "2",而不是 "Sum: 3"
echo 'Sum: ' . 1 + 2;

// 同样,添加括号确保了预期的计算顺序
echo 'Sum: ' . (1 + 2);

如果传递了多个参数,那么就不需要括号来强制执行优先级,因为每个表达式都是独立的。

<?php
echo "Hello ", isset($name) ? $name : "John Doe", "!";

echo
"Sum: ", 1 + 2;

另请参阅

添加笔记

用户贡献笔记 3 个笔记

36
pemapmodder1970 at gmail dot com
7 年前
使用逗号 (',') 将多个参数传递给 echo 与使用连接运算符 ('.') 并不完全相同。存在两个显著区别。

首先,连接运算符的优先级要高得多。参考 https://php.net/operators.precedence, 许多运算符的优先级低于连接运算符,因此建议使用多参数形式而不是传递连接的字符串。

<?php
echo "The sum is " . 1 | 2; // 输出:"2"。需要括号。
echo "The sum is ", 1 | 2; // 输出:"The sum is 3"。正常。
?>

其次,一个略微令人困惑的现象是,与向函数传递参数不同,这些值是逐个评估的。

<?php
function f($arg){
var_dump($arg);
return
$arg;
}
echo
"Foo" . f("bar") . "Foo";
echo
"\n\n";
echo
"Foo", f("bar"), "Foo";
?>

输出将是
string(3) "bar"FoobarFoo

Foostring(3) "bar"
barFoo

对于使用 sleep() 等阻塞函数作为参数的脚本,这将成为一个令人困惑的错误

<?php
while(true){
echo
"Loop start!\n", sleep(1);
}
?>

对比

<?php
while(true){
echo
"Loop started!\n" . sleep(1);
}
?>

使用 ',', 光标会在每行开头停止,而使用 '.', 光标会在每行开头 0 之后停止(因为 sleep() 返回 0)。
-7
t3tesla at gmail dot com
3 年前
我们可以将 'echo' 的快捷语法与条件运算符 (expr1) ? (expr2) : (expr3) 一起使用

<?php
$some_var
= 10;
?>
返回 HTML
<p class="<?=$some_var>5 ? "class1" : "class2"?>">Some text.</p>

将给出:<p class="class1">Some text.</p>

<?php
$some_var
= 4;
?>
<p class="<?=$some_var>5 ? "class1" : "class2"?>">Some text.</p>

将给出:<p class="class2">Some text.</p>
-11
retrobytespr at mail dot com
2 年前
如果有一大块文本,比如你的博客或包含代码示例的某些内容,可以使用 <<< 运算符 (?) 来定义要回显的块的开始和结束。例如

<?php
echo <<< JAVASCRIPT

function convertTroyOuncesToGrams(troyOunce) {
return troyOunce / 31.1034768;
}

JAVASCRIPT; # 块的结尾

?>

你也可以将 PHP 字符串和其他简单的标量嵌入到你的文本块中,例如

<?php
$troyOunceAsGrams
= 31.1034768;

echo <<< JAVASCRIPT

function convertTroyOuncesToGrams(troyOunce) {
return troyOunce /
{$troyOunceAsGrams};
}

JAVASCRIPT;
To Top