PHP Conference Japan 2024

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 '這個 ', '字串 ', '是 ', '使用多個參數 ', '建立的。', "\n";
echo
'這個 ' . '字串 ' . '是 ' . '使用串連 ' . '建立的。' . "\n";

// 不會添加換行符號或空格;以下輸出 "helloworld" 在同一行上
echo "hello";
echo
"world";

// 與上述相同
echo "hello", "world";

echo
"此字串跨越多行。
換行符號也會輸出。"
;

echo
"此字串跨越\n多行。\n換行符號也會輸出。";

// 參數可以是產生字串的任何表達式
$foo = "example";
echo
"foo 是 $foo"; // foo 是 example

$fruits = ["檸檬", "柳橙", "香蕉"];
echo
implode(" 和 ", $fruits); // 檸檬和柳橙和香蕉

// 非字串表達式將被強制轉換為字串,即使使用了 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) 先被計算,
// 並且永遠為 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;

參見

新增註解

使用者貢獻的註解 1 則註解

pemapmodder1970 at gmail dot com
7 年前
使用逗號 (',') 將多個參數傳遞給 echo 與使用串聯運算符 ('.') 並非完全相同。有兩個顯著的差異。

首先,串聯運算符的優先級高得多。參考 https://php.dev.org.tw/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);
}
?>

vs

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

使用 ',' 時,游標在每行開頭停止,而使用 '.' 時,游標在每行開頭的 0 之後停止 (因為 sleep() 返回 0)。
To Top