1 つ以上の文字列を出力する

# echo

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

echo — 1 つ以上の文字列を出力する

### 説明

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` is not an expression

    <?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 が先に評価され、3*3がその次に評価されます。
>     // echo 文は、式の評価結果全体をひとつの引数とみなします。

>     echo "hello", " world", PHP_EOL;
>     // "hello world" を出力します。

>     echo("hello"), (" world"), PHP_EOL;
>     // "hello world" を出力します; 括弧は個々の式の一部です。
>     ?>

> 例4 不正な式

>     <?php
>     echo("hello", " world"), PHP_EOL;
>     // Parse Error をスローします。なぜなら、 ("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 より前のバージョンでは、以下は "Sum: 3" ではなく、"2" を出力していました。
    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