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.
- Como mostrar texto, números e variáveis com
echo. - Como mostrar várias coisas de uma vez, com vírgulas.
- O que é o
printe no que ele difere doecho. - Como pular linha:
\n,PHP_EOLe, 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
\nno 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:
| Linha | O 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ê.
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.
echo | print | |
|---|---|---|
| Mostra texto, números, variáveis | sim | sim |
| Vários valores com vírgula | sim | não (Parse error) |
| Devolve um valor | não | sempre 1 |
| Precisa de parênteses | não | não |
| Uso no dia a dia | o mais comum | raro |
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.)
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
nvira 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 aparece | Para 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";
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
| Aspas | Variáveis ($nome) | Códigos como \n | Pense como… |
|---|---|---|---|
"duplas" | trocadas pelo valor | viram quebra de linha etc. | "leia e interprete" |
'simples' | ficam como estão | ficam 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
$ 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>.
$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";).
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).
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
| Escrita | O que faz | Exemplo → saída |
|---|---|---|
echo valor; | Mostra um valor | echo "Oi"; → Oi |
echo a, b, c; | Mostra vários valores, colados | echo "a", 1, "b"; → a1b |
echo a . b; | Junta os textos e mostra | echo "Oi, " . $nome; → Oi, Ana |
print valor; | Mostra um valor só e devolve 1 | print "Oi"; → Oi |
"\n" | Quebra de linha (só em aspas duplas) | echo "a\nb"; → a / b |
PHP_EOL | Quebra de linha do sistema | echo "a", PHP_EOL; |
<br> | Quebra de linha numa página web | echo "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 / null | No echo, viram 1 / nada / nada | use var_dump para ver |
Exercícios
1. Complete com vírgula
Complete para mostrar Olá, Ana (a variável $nome vale "Ana"):
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:
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
echomostra valores: textos (entre aspas), números, variáveis. Não precisa de parênteses.- Com vírgulas, o
echomostra vários valores colados; com o ponto, você junta os textos antes. printé parecido, mas aceita um valor só e devolve1. No dia a dia, useecho.- O
echonão pula linha sozinho: no terminal,\nouPHP_EOL; na página web,<br>. - Aspas duplas trocam variáveis e entendem
\n; aspas simples mostram tudo ao pé da letra. trueaparece como1;falseenull, como nada. Para arrays,print_r.- Texto que vem do usuário, numa página web:
echo htmlspecialchars($texto);.