(PHP 4, PHP 5, PHP 7, PHP 8)
echo — Выводит строки
Языковая конструкция выводит одно или несколько выражений без дополнительных символов новой строки или пробелов.
С точки зрения строгой терминологии, 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
// Поскольку 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 "привет";
// Выведет «привет»
echo("привет");
// Тоже выведет «привет», потому что ("привет") — корректное выражение
echo(1 + 2) * 3;
// Выведет «9»; круглые скобки приводят к тому, что сначала вычисляется 1 + 2, а затем 3 * 3;
// конструкция echo видит всё выражение как один аргумент
echo "привет", " мир";
// Выведет «привет мир»
echo("привет"), (" мир");
// Выведет «привет мир»; круглые скобки — часть каждого выражения
echo("привет", " мир");
// Выбросит ошибку синтаксического анализа, потому что ("привет", "мир") — некорректное выражение
?>
Передача нескольких аргументов в 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;