(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
// Однако следующие примеры работают:
($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;