PHP 8.5.0 Alpha 1 available for testing

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";

// Новая строка или пробел не добавляются; следующий пример выведет "приветмир" в одну строку
echo "привет";
echo
"мир";

// То же, что и предыдущий пример
echo "привет", "мир";

echo
"Эта строка занимает
несколько строк. Переводы строк тоже
выводятся"
;

echo
"Эта строка занимает\nнесколько строк. Переводы строк тоже\nвыводятся.";

// В аргументах разрешается передавать выражения, которые вычисляются как строки
$foo = "пример";
echo
"пример — это $foo"; // пример — это пример

$fruits = ["лимон", "апельсин", "банан"];
echo
implode(" и ", $fruits); // лимон и апельсин и банан

// Нестроковые выражения приводятся к строковым,
// даже при установке строгой проверки типов конструкцией declare(strict_types=1)
echo 6 * 7; // 42

// Однако следующие примеры работают:
($some_var) ? print 'true' : print 'false'; // print — тоже конструкция,
// но это допустимое выражение, которое возвращает 1,
// поэтому конструкция print допустима в этом контексте.

echo $some_var ? 'true': 'false'; // Сначала выполняется выражение, а результат передаётся в конструкцию echo

?>

Пример #2 Конструкция echo не относится к выражениям

<?php

// Следующий код недопустим, поскольку языковая конструкция echo не ведёт себя как выражение:
($some_var) ? echo 'true' : echo 'false';

?>

Примечания

Замечание: Конструкцию нельзя вызывать как функцию переменной или передавать как именованный аргумент, поскольку это языковая конструкция, а не функция.

Замечание: Использование с круглыми скобками

Заключение одного аргумента для конструкции echo в круглые скобки не вызовет синтаксической ошибки и создаст синтаксис, который выглядит как обычный вызов функции. Однако это может ввести в заблуждение, потому что круглые скобки интерпретируются как часть выводимого выражения, а не часть самого синтаксиса echo.

Пример #3 Аргументы в круглых скобках

<?php

echo "привет", PHP_EOL;;
// Выведет «привет»

echo("привет"), PHP_EOL;;
// Тоже выведет "привет", потому что ("привет") — корректное выражение

echo(1 + 2) * 3, PHP_EOL;;
// Выведет "9"; круглые скобки изменяют порядок вычисления, поэтому сначала вычисляется выражение 1 + 2, а затем выражение 3 * 3;
// конструкция echo видит всё выражение как один аргумент

echo "привет", " мир", PHP_EOL;;
// Выведет "привет мир"

echo("привет"), (" мир"), PHP_EOL;
// Выведет "привет мир"; круглые скобки — часть каждого выражения

?>

Пример #4 Недопустимое выражение

<?php

echo("hello", " world"), PHP_EOL;
// Конструкция выбросит ошибку синтаксического анализа Parse Error,
// потому что ("привет", "мир") — некорректное выражение

?>

Подсказка

Передача набора аргументов в конструкция echo помогает избегать осложнений, связанных с приоритетом оператора конкатенации в PHP. У оператора конкатенации, например, более высокий приоритет, чем у тернарного оператора, а до PHP 8.0.0 у точки был тот же приоритет, что и у сложения с вычитанием:

<?php

// В следующем примере выражение 'Привет, ' . isset($name) вычисляется первым
// как значение true, поэтому echo выводит аргумент $name
echo 'Привет, ' . isset($name) ? $name : 'Джон Доу' . '!';

// Скобки переопределят порядок вычисления и конструкция поведёт себя как планировалось
echo 'Привет, ' . (isset($name) ? $name : 'Джон Доу') . '!';

// До PHP 8.0.0 следующий пример выводил "2", а не "Сумма: 3"
echo 'Сумма: ' . 1 + 2;

// И снова, добавление круглых скобок указывает точный порядок вычисления выражения.
echo 'Сумма: ' . (1 + 2);

?>

При передаче набора аргументов скобки не требуются для принудительной установки приоритета, поскольку каждое выражение обрабатывается отдельно:

<?php

echo "Привет, ", isset($name) ? $name : "Джон Доу", "!";

echo
"Сумма: ", 1 + 2;

Смотрите также

Добавить

Примечания пользователей 1 note

up
41
pemapmodder1970 at gmail dot com
8 years ago
Passing multiple parameters to echo using commas (',')is not exactly identical to using the concatenation operator ('.'). There are two notable differences.

First, concatenation operators have much higher precedence. Referring to http://php.net/operators.precedence, there are many operators with lower precedence than concatenation, so it is a good idea to use the multi-argument form instead of passing concatenated strings.

<?php
echo "The sum is " . 1 | 2; // output: "2". Parentheses needed.
echo "The sum is ", 1 | 2; // output: "The sum is 3". Fine.
?>

Second, a slightly confusing phenomenon is that unlike passing arguments to functions, the values are evaluated one by one.

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

The output would be:
string(3) "bar"FoobarFoo

Foostring(3) "bar"
barFoo

It would become a confusing bug for a script that uses blocking functions like sleep() as parameters:

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

vs

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

With ',' the cursor stops at the beginning every newline, while with '.' the cursor stops after the 0 in the beginning every line (because sleep() returns 0).
To Top