输出一个或多个字符串

# echo

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

echo — 输出一个或多个字符串

### 说明

function echo(string `...$expressions`): void

输出一个或多个表达式，没有额外的换行符或者空格。

`echo` 不是函数，而是语言结构。它的参数是表达式列表，跟在 `echo` 关键字后面，用逗号分隔，不用括号分隔。与其它的返回结构不同，`echo` 没有返回值，因为不能在表达式的上下文中使用。

`echo` 也有快捷语法，可以在开始标记后直接跟等号。即使禁用了 short_open_tag 配置，此语法也可用。

    I have <?=$foo?> foo.

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

### 参数

`expressions`

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

### 返回值

没有返回值。

### 示例

示例 #1 `echo` 示例

    <?php
    echo "echo does not require parentheses.";

    // 字符串可以作为多个参数单独传递，
    // 也可以连接在一起作为单个参数传递
    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

    // 但是，下面的示例又正常：
    ($some_var) ? print 'true' : print 'false'; // print 也是语言结构，
                                                // 但它是有效的表达式，返回 1，
                                                // 所以可以在此上下文中使用。

    echo $some_var ? 'true': 'false'; // 首先运行表达式然后传递它到 echo
    ?>

示例 #2 `echo` 不是表达式

    <?php

    // 因为 echo 的行为与表达式不同，所以下面的代码无效。
    ($some_var) ? echo 'true' : echo 'false';
    ?>

### 注释

> 注意: 因为是语言构造器而不是函数，不能被 可变函数 或者 命名参数 调用。

> 注意: 使用括号

> 使用括号括住 `echo` 后的单个参数并不会引发语法错误，而且还会产生看起来像普通函数调用的语法。但是，这可能会产生误导，因为括号实际上是输出表达式的一部分，而不是 `echo` 语法本身的一部分。

> 示例 #3 使用括号

>     <?php
>     echo "hello", PHP_EOL;
>     // 输出“hello”

>     echo("hello"), PHP_EOL;
>     // 也会输出“hello”，因为 ("hello") 是有效表达式

>     echo(1 + 2) * 3, PHP_EOL;
>     // 输出“9”；首先对括号内的 1+2 求值，然后 echo 语句将
>     // 整个表达式 3*3 视为一个参数

>     echo "hello", " world", PHP_EOL;
>     // 输出“hello world”

>     echo("hello"), (" world"), PHP_EOL;
>     // 输出“hello world”；括号是每个表达式的一部分
>     ?>

> 示例 #4 无效表达式

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

小技巧

将多个参数传递给 `echo` 可以避免 PHP 中连接运算符中优先级引起的复杂性。例如，连接运算符的优先级高于三元运算符，在 PHP 8.0.0 之前与加减法具有相同的优先级。

    <?php
    // 下面的表达式 'Hello ' . isset($name) 将首先求值，
    // 因为始终为 true，所以 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;

### 参见

- print - 输出字符串
- printf() - 输出格式化字符串
- flush() - 冲刷系统输出缓冲区
- 指定文本字符串的方式

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open