echo Output one or more strings &reftitle.description; voidecho stringexpressions Outputs one or more expressions, with no additional newlines or spaces. echo is not a function but a language construct. Its arguments are a list of expressions following the echo keyword, separated by commas, and not delimited by parentheses. Unlike some other language constructs, echo does not have any return value, so it cannot be used in the context of an expression. echo also has a shortcut syntax, where you can immediately follow the opening tag with an equals sign. This syntax is available even with the short_open_tag configuration setting disabled. foo. ]]> The major differences to print are that echo accepts multiple arguments and doesn't have a return value. &reftitle.parameters; expressions One or more string expressions to output, separated by commas. Non-string values will be coerced to strings, even when the strict_types directive is enabled. &reftitle.returnvalues; &return.void; &reftitle.examples; <literal>echo</literal> examples ]]> &reftitle.notes; ¬e.language-construct; Using with parentheses Surrounding a single argument to echo with parentheses will not raise a syntax error, and produces syntax which looks like a normal function call. However, this can be misleading, because the parentheses are actually part of the expression being output, not part of the echo syntax itself. <programlisting role="php"> <![CDATA[ <?php echo "hello"; // outputs "hello" echo("hello"); // also outputs "hello", because ("hello") is a valid expression echo(1 + 2) * 3; // outputs "9"; the parentheses cause 1+2 to be evaluated first, then 3*3 // the echo statement sees the whole expression as one argument echo "hello", " world"; // outputs "hello world" echo("hello"), (" world"); // outputs "hello world"; the parentheses are part of each expression echo("hello", " world"); // Throws a Parse Error because ("hello", " world") is not a valid expression ?> ]]> </programlisting> </example> </para> </note> <tip> <para> Passing multiple arguments to <literal>echo</literal> can avoid complications arising from the precedence of the concatenation operator in PHP. For instance, the concatenation operator has higher precedence than the ternary operator, and prior to PHP 8.0.0 had the same precedence as addition and subtraction: </para> <programlisting role="php"> <![CDATA[ <?php // Below, the expression 'Hello ' . isset($name) is evaluated first, // and is always true, so the argument to echo is always $name echo 'Hello ' . isset($name) ? $name : 'John Doe' . '!'; // The intended behaviour requires additional parentheses echo 'Hello ' . (isset($name) ? $name : 'John Doe') . '!'; // In PHP prior to 8.0.0, the below outputs "2", rather than "Sum: 3" echo 'Sum: ' . 1 + 2; // Again, adding parentheses ensures the intended order of evaluation echo 'Sum: ' . (1 + 2); ]]> </programlisting> <para> If multiple arguments are passed in, then parentheses will not be required to enforce precedence, because each expression is separate: </para> <programlisting role="php"> <![CDATA[ <?php echo "Hello ", isset($name) ? $name : "John Doe", "!"; echo "Sum: ", 1 + 2; ]]> </programlisting> </tip> </refsect1> <refsect1 role="seealso"> &reftitle.seealso; <para> <simplelist> <member><function>print</function></member> <member><function>printf</function></member> <member><function>flush</function></member> <member><link linkend="language.types.string">Ways to specify literal strings</link></member> </simplelist> </para> </refsect1> </refentry> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t indent-tabs-mode:nil sgml-parent-document:nil sgml-default-dtd-file:"~/.phpdoc/manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->