PHP echo e print

Um programa que não mostra nada não serve para muita coisa. No PHP, o jeito mais comum de mostrar algo, seja no terminal, seja numa página web, é o echo. Ele tem um irmão quase gêmeo, o print. Nesta aula você vai conhecer os dois a fundo, aprender a pular linhas do jeito certo no terminal e no navegador, e entender por que as aspas que você escolhe mudam o resultado.

Você vai aprender
  • Como mostrar texto, números e variáveis com echo.
  • Como mostrar várias coisas de uma vez, com vírgulas.
  • O que é o print e no que ele difere do echo.
  • Como pular linha: \n, PHP_EOL e, numa página web, <br>.
  • A ideia das aspas simples e duplas.

A ideia: o alto-falante do programa

Pense no PHP como alguém trabalhando numa sala fechada. Ele pode fazer contas, guardar informações, tomar decisões, mas ninguém lá fora fica sabendo. O echo é o alto-falante da sala: tudo o que você entrega a ele sai para fora. O nome vem do inglês echo, "eco": o PHP "ecoa" o que você mandou.

"Para fora" depende de onde o programa está rodando. No terminal, é a tela do terminal. Numa página web, é o HTML que o navegador recebe (veja Como o PHP Funciona). O echo não sabe a diferença: ele só entrega o texto.


O echo

<?php
echo "Olá, mundo!\n";
$ php ola.php
Olá, mundo!
echo
"Mostre isto." É uma palavra da própria linguagem, não uma função (por isso não precisa de parênteses).
"Olá, mundo!\n"
O texto a mostrar, entre aspas. O \n no final é a quebra de linha (já vamos chegar nela).
;
Fim da instrução, como em todo comando PHP (veja Sintaxe).

Textos, números e variáveis

O echo mostra qualquer valor simples. Textos vão entre aspas; números, não. E ele mostra o resultado de uma conta, não a conta:

<?php
echo 42, "\n";
echo 3.5, "\n";
echo 10 / 4, "\n";
echo true, "\n";
echo false, "\n";
echo null, "\n";
echo "fim\n";
$ php valores.php
42
3.5
2.5
1                                     « true aparece como 1


fim                                   « false e null aparecem como nada

Os números aparecem como você espera. Os valores true ("verdadeiro") e false ("falso") surpreendem: true vira 1 e false vira nada; null ("nenhum valor") também vira nada. Por isso, para conferir um valor, o echo engana, e existe o var_dump (veja var_dump e print_r e Booleanos).

Com variáveis, você escreve o nome da variável, e o echo mostra o valor guardado nela:

<?php
$nome = "Ana";
echo $nome;
echo "\n";
$ php variavel.php
Ana

Várias coisas de uma vez: as vírgulas

O echo aceita vários valores separados por vírgula e mostra todos, um colado no outro, na ordem. Você já viu isso acima, em echo 42, "\n";: são dois valores, o número e a quebra de linha.

<?php
$nome = "Ana";
$idade = 29;
echo "Nome: ", $nome, " | Idade: ", $idade, "\n";
echo "Nome: " . $nome . " | Idade: " . $idade . "\n";
$ php virgulas.php
Nome: Ana | Idade: 29
Nome: Ana | Idade: 29

As duas linhas dão o mesmo resultado, por caminhos diferentes:

LinhaO que acontece
echo "Nome: ", $nome, …;O echo recebe cinco valores e mostra um depois do outro.
echo "Nome: " . $nome . …;O ponto . junta os pedaços num texto só, e o echo recebe um valor. O ponto é o operador de juntar textos (veja Operadores de String).

Repare que a vírgula não põe espaço: echo "a", "b"; mostra ab. Os espaços de " | Idade: " estão dentro das aspas. Nos dois jeitos, quem cuida dos espaços é você.

Vírgula ou ponto?

No echo, tanto faz para o resultado. A vírgula só funciona no echo; o ponto funciona em qualquer lugar, inclusive para guardar o texto montado numa variável ($frase = "Olá, " . $nome;). Use o que achar mais fácil de ler.

Missão: mostre Nome: Bruno numa linha e Cidade: Recife na linha de baixo, usando as variáveis $nome e $cidade (sem digitar "Bruno" e "Recife" nos echo). Use vírgulas ou pontos, como preferir.

<?php
$nome = "Bruno";
$cidade = "Recife";
echo "Nome: ", "\n";
<?php
$nome = "Bruno";
$cidade = "Recife";
echo "Nome: ", $nome, "\n";
echo "Cidade: ", $cidade, "\n";

Parênteses e texto em várias linhas

Você vai ver echo("…") em códigos por aí. Funciona, mas os parênteses ali não são do echo: são só parênteses em volta de um valor, como numa conta. Com vírgula dentro, não funciona:

<?php
echo("Nome: ", "Ana");
$ php parenteses2.php

Parse error: syntax error, unexpected token "," in /home/ana/saida/parenteses2.php on line 2

Prefira o echo sem parênteses. Já um texto entre aspas pode ocupar várias linhas do arquivo; as quebras de linha viram parte do texto:

<?php
echo "Lista de compras:
- pão
- leite
";
$ php varias.php
Lista de compras:
- pão
- leite

Para textos grandes há um jeito mais organizado, o heredoc (veja Heredoc e Nowdoc).


O print

O print ("imprimir") faz quase a mesma coisa que o echo:

<?php
echo "Olá, mundo!\n";
print "Olá, mundo!\n";
$ php print.php
Olá, mundo!
Olá, mundo!

Mesma saída. As diferenças são duas, e pequenas.

Diferença 1: o print aceita um valor só

<?php
print "Nome: ", "Ana";
$ php print2.php

Parse error: syntax error, unexpected token "," in /home/ana/saida/print2.php on line 2

"Vírgula inesperada": o print não sabe o que fazer com um segundo valor. Com ele, junte os pedaços com o ponto: print "Nome: " . "Ana";.

Diferença 2: o print devolve 1

O print é uma expressão: além de mostrar o texto, ele produz um valor, sempre o número 1. Por isso dá para guardar o que ele devolve numa variável. Com o echo, não dá:

<?php
$r = print "Olá!\n";
echo "O print devolveu: $r\n";
$ php retorno.php
Olá!
O print devolveu: 1
<?php
$r = echo "Olá!\n";
$ php echoexpr.php

Parse error: syntax error, unexpected token "echo" in /home/ana/saida/echoexpr.php on line 2

Na prática, quase ninguém usa esse 1. Ele existe porque o print pode aparecer no meio de expressões, como em $salvou and print "Salvo!\n"; ("se salvou, mostre"), um estilo antigo e pouco usado hoje.

echoprint
Mostra texto, números, variáveissimsim
Vários valores com vírgulasimnão (Parse error)
Devolve um valornãosempre 1
Precisa de parêntesesnãonão
Uso no dia a diao mais comumraro

Qual usar? O echo. É o que você vai encontrar em quase todo código PHP, e é o que este guia usa. Saber que o print existe serve para entender código alheio. (Diferença de velocidade entre os dois existe, mas é tão pequena que não importa.)

E o print_r?

Apesar do nome, o print_r não é parente do print: é uma função para mostrar o conteúdo de arrays, que o echo não consegue mostrar (ele escreve só a palavra Array, com um aviso). Ele é explicado em var_dump e print_r. Também existe o printf, para formatar números e textos, em printf e sprintf.


Pular linha no terminal: \n e PHP_EOL

O echo mostra exatamente o que recebe, e nada mais. Ele não pula linha sozinho. Veja:

<?php
echo "pão";
echo "leite";
echo "café";
$ php linhas.php
pãoleitecaféana@notebook:~/saida$     « tudo colado, até o prompt do terminal

Três echo em três linhas do arquivo não querem dizer três linhas na tela. Para pular linha, você precisa mandar o caractere de quebra de linha. Há duas formas:

<?php
echo "pão\n";
echo "leite", PHP_EOL;
echo "café" . PHP_EOL;
$ php linhas2.php
pão
leite
café
\n
Dentro de aspas duplas, a barra invertida seguida de n vira uma quebra de linha (new line, "nova linha"). São dois caracteres no código, mas um só na saída.
PHP_EOL
Uma constante que o PHP já traz pronta, com a quebra de linha do sistema operacional (End Of Line, "fim de linha"). Fica fora das aspas, ligada com vírgula ou ponto.

No Linux e no macOS, as duas dão o mesmo resultado. No Windows, a quebra de linha "oficial" tem dois caracteres (\r\n), e o PHP_EOL se ajusta sozinho. Para mostrar texto no terminal, qualquer uma serve; muita gente usa PHP_EOL quando quer deixar claro "aqui termina a linha", e \n quando a quebra está no meio de um texto.


Pular linha numa página web: <br>

Agora o mesmo tipo de código, só que numa página web. A lista da Ana, com \n nas duas primeiras linhas e <br> nas duas últimas:

<?php
echo "Pão\n";
echo "Leite\n";
echo "Café<br>\n";
echo "Açúcar<br>\n";

O que o PHP envia para o navegador (o código-fonte da página), visto com o curl pelo servidor embutido:

$ curl -s localhost:8000/index.php
Pão
Leite
Café<br>
Açúcar<br>

O PHP enviou as quebras de linha, sim. Mas o navegador lê esse texto como HTML, e no HTML quebras de linha e espaços repetidos valem como um espaço. Quem pula linha na página é a etiqueta <br> (break, "quebra"). Na tela do navegador, aparecem duas linhas: Pão Leite Café na primeira (as quebras \n viraram espaços) e Açúcar na segunda (graças ao <br> depois de Café).

A regra:

Onde aparecePara pular linha
Terminal (php arquivo.php)\n ou PHP_EOL
Página web (o que o navegador mostra)<br>, ou parágrafos <p>…</p>
Código-fonte da página (o que você vê com "Exibir código-fonte")\n: deixa o HTML gerado organizado, uma etiqueta por linha

Por isso é comum escrever os dois juntos, "Café<br>\n": o <br> para quem vê a página, o \n para quem lê o código-fonte. Misturar PHP e HTML é o assunto de PHP Dentro do HTML.

Missão: esta caixa funciona como uma página web. Clique em Rodar e veja, na aba Resultado, os itens todos na mesma linha. Faça cada item aparecer numa linha própria no navegador. Depois compare com a aba Código-fonte HTML.

<?php
echo "Pão\n";
echo "Leite\n";
echo "Café\n";
<?php
echo "Pão<br>\n";
echo "Leite<br>\n";
echo "Café<br>\n";
Mostrando o que o usuário digitou

Numa página web, o echo manda o texto como HTML. Se você mostrar algo que veio de um formulário, alguém pode digitar etiquetas HTML (ou até programas JavaScript) e elas vão funcionar na sua página. Por isso, todo texto que vem de fora passa pelo htmlspecialchars antes do echo: echo htmlspecialchars($nome);. A explicação completa está em Escapar a Saída (XSS); por enquanto, guarde o hábito.


Aspas simples × aspas duplas (a ideia)

Até aqui todos os textos usaram aspas duplas. O PHP também aceita aspas simples, e elas não são iguais:

<?php
$nome = "Ana";
echo "Olá, $nome!\n";
echo 'Olá, $nome!\n';
echo "\n";
$ php aspas.php
Olá, Ana!
Olá, $nome!\n
AspasVariáveis ($nome)Códigos como \nPense como…
"duplas"trocadas pelo valorviram quebra de linha etc."leia e interprete"
'simples'ficam como estãoficam como estão"copie ao pé da letra"

Entre aspas duplas, o PHP procura variáveis e códigos com barra e os troca; isso se chama interpolação. Entre aspas simples, o texto sai exatamente como foi escrito. Repare que a segunda linha nem pulou: o \n saiu como os dois caracteres \ e n, e foi preciso o echo "\n"; da última linha para pular.

Com isso você já consegue escolher: precisa de variável ou de \n dentro do texto? Aspas duplas. Texto fixo? Qualquer uma serve. Os detalhes (como colocar aspas dentro de aspas, {$…}, outros códigos com barra) ficam para Strings e Interpolação.


Quando dá errado

Tudo saiu numa linha só
$ php linhas.php
pãoleitecaféana@notebook:~/saida$

O que aconteceu: o echo não pula linha sozinho.

Como consertar: termine cada texto com \n (dentro de aspas duplas) ou acrescente , PHP_EOL. Numa página web, use <br>.

Apareceu $nome ou \n literalmente
$ php aspas.php
Olá, Ana!
Olá, $nome!\n

O que aconteceu: não é erro do PHP: o texto estava entre aspas simples, que não interpretam nada.

Como consertar: troque por aspas duplas: "Olá, $nome!\n".

unexpected token "," com print ou echo(…)
$ php print2.php

Parse error: syntax error, unexpected token "," in /home/ana/saida/print2.php on line 2

O que aconteceu: o print aceita um valor só, e echo("a", "b") põe a vírgula dentro de parênteses de um valor só.

Como consertar: use echo sem parênteses (echo "Nome: ", "Ana";) ou junte com ponto (print "Nome: " . "Ana";).

Apareceu a palavra Array
$ php arr.php

Warning: Array to string conversion in /home/ana/saida/arr.php on line 3
Array

O que aconteceu: você deu um array inteiro para o echo. Ele só sabe mostrar valores simples (texto, número).

Como consertar: mostre um item (echo $frutas[0];) ou use print_r($frutas); para ver tudo (veja var_dump e print_r).

O true virou 1 e o false sumiu
$ php valores.php
42
3.5
2.5
1


fim

O que aconteceu: não é erro: é assim que o echo mostra true, false e null.

Como consertar: para ver o valor real e o tipo, use var_dump($valor);.

Missão final: monte o recibo da lojinha da Ana em três linhas: Recibo da Ana, Produto: Caderno e Total: R$ 37.5. Use as variáveis, echo com vírgulas e PHP_EOL para pular as linhas. O código atual tem um problema de aspas e não pula linha nenhuma.

<?php
$produto = "Caderno";
$total = 37.5;
echo "Recibo da Ana";
echo 'Produto: $produto';
echo "Total: R$ ", $total;
<?php
$produto = "Caderno";
$total = 37.5;
echo "Recibo da Ana", PHP_EOL;
echo "Produto: ", $produto, PHP_EOL;
echo "Total: R$ ", $total, PHP_EOL;

Referência

EscritaO que fazExemplo → saída
echo valor;Mostra um valorecho "Oi"; → Oi
echo a, b, c;Mostra vários valores, coladosecho "a", 1, "b"; → a1b
echo a . b;Junta os textos e mostraecho "Oi, " . $nome; → Oi, Ana
print valor;Mostra um valor só e devolve 1print "Oi"; → Oi
"\n"Quebra de linha (só em aspas duplas)echo "a\nb"; → a / b
PHP_EOLQuebra de linha do sistemaecho "a", PHP_EOL;
<br>Quebra de linha numa página webecho "Pão<br>\n";
"Olá, $nome"Aspas duplas: troca a variável→ Olá, Ana
'Olá, $nome'Aspas simples: ao pé da letra→ Olá, $nome
true / false / nullNo echo, viram 1 / nada / nadause var_dump para ver

Exercícios

1. Complete com vírgula

Complete para mostrar Olá, Ana (a variável $nome vale "Ana"):

echo "Olá, "

2. A constante da quebra de linha

Qual constante do PHP guarda a quebra de linha do sistema operacional?

3. Quebra no navegador

Complete a etiqueta HTML que pula linha numa página web:

echo "Leite";

4. O que echo 'Total: $total\n'; mostra, se $total vale 10?

5. Qual destas linhas dá Parse error?

6. O que $x = print "oi"; guarda em $x?

7. Uma página PHP faz echo "Pão\n"; echo "Leite\n";. O que o navegador mostra?


Resumo

  • echo mostra valores: textos (entre aspas), números, variáveis. Não precisa de parênteses.
  • Com vírgulas, o echo mostra vários valores colados; com o ponto, você junta os textos antes.
  • print é parecido, mas aceita um valor só e devolve 1. No dia a dia, use echo.
  • O echo não pula linha sozinho: no terminal, \n ou PHP_EOL; na página web, <br>.
  • Aspas duplas trocam variáveis e entendem \n; aspas simples mostram tudo ao pé da letra.
  • true aparece como 1; false e null, como nada. Para arrays, print_r.
  • Texto que vem do usuário, numa página web: echo htmlspecialchars($texto);.