PHP O Editor do Guia
Quase toda aula tem caixas Experimente: um editor de código com um botão Rodar. Elas não são uma imitação do PHP: rodam o PHP 8.5 de verdade, o programa oficial, transformado num formato que o navegador sabe executar. Nesta aula você vai aprender a usar cada parte do editor, nos dois modos (terminal e página web), e saber o que ele consegue e o que não consegue fazer.
- Rodar, parar e ler a saída (inclusive os erros e o código de saída).
- O que acontece na primeira vez que você clica em Rodar.
- Passar argumentos e digitar a entrada de um programa.
- Trabalhar com várias abas (vários arquivos).
- Usar o modo web: Resultado, Código-fonte HTML, links e formulários.
- Restaurar o código, ver a solução e cumprir missões.
- O que funciona e o que não funciona no PHP do navegador.
A ideia: um laboratório portátil
Na escola, o laboratório de ciências tem tudo pronto: você chega, faz o experimento e vai embora, sem levar nada para casa. O editor do guia é assim. O PHP fica guardado dentro da página, num "computador de mentirinha" que só existe enquanto a aba está aberta: ele tem uma pasta da Ana (/home/ana), aceita arquivos e banco de dados SQLite, e nada do que você fizer ali toca no seu computador de verdade. Se algo der muito errado, é só recarregar a página.
O motor é o mesmo que o projeto WordPress Playground usa: o PHP 8.5.10 oficial compilado para WebAssembly (um formato de programa que os navegadores modernos executam quase tão rápido quanto um programa comum). Por isso as mensagens de erro, os avisos e as saídas são os mesmos do PHP instalado.
O modo terminal (o padrão)
A maioria das caixas funciona como o comando php programa.php num terminal: o código é um arquivo, e a saída aparece como texto. Rode esta:
<?php echo "Olá, mundo!\n"; echo "2 + 3 = " . (2 + 3) . "\n";
As partes da caixa, de cima para baixo:
- Aba
programa.php - O nome do arquivo que está sendo editado. Algumas caixas têm várias abas (veja Várias abas).
- Restaurar
- Volta ao código original da aula, apagando as suas mudanças.
- Editor
- Clique e digite. Os números à esquerda são os números das linhas, os mesmos que as mensagens de erro citam.
- Argumentos
- Palavras passadas ao programa, como no terminal (veja Argumentos e entrada).
- ▶ Rodar
- Executa o código. Enquanto o programa roda, o botão vira ■ Parar.
- Terminal
- Aparece depois de rodar, com o comando (
ana@notebook:~$ php programa.php), a saída do programa e, no fim, o código de saída.
Depois de rodar, o terminal da caixa mostra:
ana@notebook:~$ php programa.php Olá, mundo! 2 + 3 = 5 [código de saída: 0]
O [código de saída: 0] é o número que o programa devolve ao terminar: 0 quer dizer "terminou bem"; qualquer outro número indica um problema (o PHP usa 255 para erros fatais). No terminal de verdade, esse número fica escondido, e você o vê com echo $?; o editor mostra sempre. A aula PHP na Linha de Comando explica como escolher esse número com exit.
A primeira vez: o carregamento
Na primeira vez que você clica em Rodar numa página, o navegador baixa o PHP (cerca de 8 MB). Aparece uma barra com a mensagem Carregando o PHP (≈ 7,6 MB, só na primeira vez)… e a porcentagem, depois Preparando o PHP 8.5…. Leva de um a alguns segundos, conforme a internet. Depois disso:
- as outras caixas da mesma página rodam na hora;
- nas outras aulas, o navegador reaproveita o arquivo já baixado (fica guardado no cache), então o carregamento é bem mais rápido;
- se a internet cair durante o download, aparece
Não consegui carregar o PHP: …; confira a conexão e clique em Rodar de novo.
Atalhos do editor
| Tecla | O que faz |
|---|---|
| Ctrl+Enter (Mac: Cmd+Enter) | Roda o código, sem tirar a mão do teclado. |
| Tab | Insere 4 espaços (o recuo padrão do PHP). Com várias linhas selecionadas, recua todas. |
| Shift+Tab | Tira um nível de recuo. |
| Enter | Pula a linha mantendo o recuo; depois de {, ( ou [, recua mais um nível. |
| Esc | Sai do editor (para quem navega pelo teclado: depois, Tab vai para o próximo botão). |
Erros e avisos
Quando o PHP reclama, a mensagem aparece no terminal da caixa, em destaque, exatamente como no terminal de verdade. Este programa tem um aviso e um erro fatal. Rode e compare com o que o editor mostra:
<?php echo "Antes do erro\n"; echo $preco; echo "Depois do aviso\n"; echo total(); echo "Esta linha nunca roda\n";
ana@notebook:~$ php programa.php
Antes do erro
Warning: Undefined variable $preco in /home/ana/programa.php on line 3
Depois do aviso
Fatal error: Uncaught Error: Call to undefined function total() in /home/ana/programa.php:5
Stack trace:
#0 {main}
thrown in /home/ana/programa.php on line 5
[código de saída: 255]
Repare na diferença: depois do aviso (Warning, linha 3), o programa continuou e escreveu "Depois do aviso"; depois do erro fatal (Fatal error, linha 5), ele parou, e a última linha nunca rodou. O código de saída 255 confirma o erro. É a mesma saída do laboratório do guia (lá o arquivo se chamava erro.php). A aula Lendo Erros do PHP ensina a ler cada parte dessas mensagens.
Parar um programa
Um programa que não termina nunca (um "laço infinito", que você vai conhecer em while e do-while) não trava a página: o PHP roda separado. Clique em ■ Parar: o terminal mostra ^C (como o Ctrl+C do terminal) e o código de saída 130, o mesmo que o terminal de verdade usa para "interrompido". Se você não parar, o editor para sozinho depois de 30 segundos, com a mensagem (o editor parou o programa: ele rodou mais de 30 segundos sem terminar — laço infinito?). E se um programa escrever demais (mais de 2 MB de texto), o editor também o interrompe.
Argumentos e entrada
Programas de terminal recebem informações de dois jeitos: argumentos (palavras escritas depois do nome do arquivo, como em php args.php Ana 29) e entrada (o que a pessoa digita enquanto o programa roda). O editor tem os dois.
Argumentos
O campo Argumentos faz o papel das palavras depois do nome do arquivo. Separe-as com espaços; para um argumento com espaço dentro, use aspas ("Ana Souza"). Dentro do programa, eles ficam na lista $argv. Rode a caixa abaixo, depois troque Ana 29 no campo Argumentos por Bruno e rode de novo:
<?php echo "Você passou " . ($argc - 1) . " argumento(s).\n"; echo "Olá, " . ($argv[1] ?? "ninguém") . "!\n";
ana@notebook:~$ php programa.php Ana 29 Você passou 2 argumento(s). Olá, Ana! [código de saída: 0]
No laboratório, com php args.php Ana 29, as duas linhas são idênticas. O $argv e o $argc são explicados em PHP na Linha de Comando.
Entrada (o teclado)
Quando um programa lê o teclado com fgets(STDIN), o editor oferece duas formas de responder:
- Campo Entrada (aparece em caixas preparadas para isso): escreva as respostas antes de rodar, uma por linha. O editor as entrega ao programa na ordem e mostra cada uma no terminal, como se tivessem sido digitadas.
- Digitando na hora: se o programa pede algo e não há resposta pronta, aparece um campo de texto dentro do terminal da caixa. Digite e aperte Enter. Ctrl+D avisa "acabou a entrada"; Ctrl+C interrompe o programa.
<?php echo "Qual é o seu nome? "; $nome = trim(fgets(STDIN)); echo "Qual é a sua idade? "; $idade = trim(fgets(STDIN)); echo "$nome tem $idade anos.\n";
ana@notebook:~$ php programa.php Qual é o seu nome? Ana Qual é a sua idade? 29 Ana tem 29 anos. [código de saída: 0]
Apague o conteúdo do campo Entrada e rode de novo: o programa vai esperar você digitar no próprio terminal da caixa.
readline() não existe no editor
No PHP instalado, a função readline("Pergunta: ") também lê o teclado. O PHP do navegador não tem essa extensão; nas caixas, use sempre fgets(STDIN). Se tentar, verá Call to undefined function readline().
Várias abas: vários arquivos
Algumas caixas têm mais de um arquivo, cada um numa aba. O primeiro é o que roda; os outros são usados por ele (por exemplo, com require, que você vai estudar em include e require). Clique nas abas para alternar. Todas as abas são gravadas na mesma pasta antes de rodar.
Missão: o preço do pão subiu. Abra a aba precos.php, troque "8,50" por "9,00" e rode (a partir de qualquer aba, o que roda é sempre o programa.php).
<?php require "precos.php"; echo "Pão: R$ " . $precos["pão"] . "\n"; echo "Leite: R$ " . $precos["leite"] . "\n";
<?php
$precos = [
"pão" => "8,50",
"leite" => "5,90",
];
<?php
$precos = [
"pão" => "9,00",
"leite" => "5,90",
];
Antes da mudança, a saída é a mesma do laboratório:
$ php programa.php Pão: R$ 8,50 Leite: R$ 5,90
O modo web: o PHP montando páginas
Nas caixas em modo web, o código é a página index.php de um site de mentirinha em localhost:8000, como se você tivesse ligado o servidor embutido e aberto a página num navegador. A caixa avisa: "O código vira a página index.php de um site em localhost:8000." Depois de rodar, aparecem:
- ← e ⟳
- Voltar para a página anterior e Recarregar (pedir a página de novo ao PHP), como no navegador.
- Barra de endereço
- O endereço pedido, como
localhost:8000/index.php. Dá para editar e apertar Enter, por exemplo para acrescentar?nome=Ana. Quando a resposta não é200, o código (como404) aparece ao lado. - Resultado
- A página desenhada, como o navegador mostra.
- Código-fonte HTML
- O texto que o PHP enviou, igual ao "Exibir código-fonte" do navegador. Tem também, num item que abre e fecha, os Cabeçalhos da resposta (
HTTP/1.1 200 OK,Content-Type…), como nocurl -i.
Formulários e links funcionam
Dentro do Resultado, links para outras páginas do site e formulários fazem uma nova requisição ao PHP, com GET ou POST, exatamente como num site de verdade. Rode, digite um nome e clique em Enviar. Depois olhe a barra de endereço (o nome foi parar nela, depois do ?) e o Código-fonte HTML:
<?php $nome = $_GET["nome"] ?? ""; ?> <form method="get"> <label>Seu nome: <input name="nome" value="<?= htmlspecialchars($nome) ?>"></label> <button>Enviar</button> </form> <?php if ($nome !== ""): ?> <p>Olá, <?= htmlspecialchars($nome) ?>!</p> <?php endif; ?>
O formulário é estudado em Formulários HTML e $_GET e $_POST. Links para sites de fora (como https://www.php.net) não abrem: a caixa mostra um aviso de que o link sai do site de exemplo.
Sessões e cookies lembram entre as requisições
Dentro da mesma caixa, cookies e sessões funcionam de uma requisição para a outra, como no navegador. Rode e clique várias vezes em ⟳ (Recarregar):
<?php session_start(); $_SESSION["visitas"] = ($_SESSION["visitas"] ?? 0) + 1; ?> <p>Você abriu esta página <?= $_SESSION["visitas"] ?> vez(es).</p> <p>Clique em ⟳ (Recarregar) e veja o número subir.</p>
Clicar em Rodar de novo recomeça o site do zero (e a contagem volta a 1). As sessões são o assunto de Sessões.
index.php
Como no php -S sem roteador, um caminho que não corresponde a nenhuma aba (como localhost:8000/contato) é entregue ao index.php da pasta, com $_SERVER['PATH_INFO'] valendo /contato. O 404 Not Found só aparece quando a pasta do caminho não tem index.php (por exemplo localhost:8000/css/nada.css, se existir uma aba css/estilo.css e nenhum css/index.php). Endereços "bonitos" estão no fim de O Servidor Embutido.
Missões, Restaurar e Ver solução
Muitas caixas trazem uma Missão: um desafio escrito acima do editor. Embaixo da caixa aparece a situação:
| Mensagem | Quer dizer |
|---|---|
Missão em andamento… | Você ainda não rodou, ou a missão não foi cumprida. |
Missão em andamento… (a saída ainda não é a esperada) | Rodou, mas o resultado ainda não é o pedido. Releia a missão. |
Missão em andamento… (ainda há avisos ou erros do PHP) | O resultado está quase lá, mas apareceu um Warning, Deprecated ou erro. A missão pede um programa limpo. |
Missão em andamento… (ainda falta: …) | A saída está certa, mas a missão exige um recurso específico no código (por exemplo, usar uma certa função) ou um certo código de saída. |
✔ Missão cumprida! | Parabéns. A partir daí, a caixa continua livre para você experimentar. |
Dois botões ajudam:
- Restaurar: devolve o código original da caixa (em todas as abas). Use quando o código ficar tão bagunçado que é mais fácil recomeçar.
- Ver solução: pergunta "Trocar o seu código pela solução?" e, se você clicar em Sim, mostrar, coloca no editor uma resposta possível. Rode-a para ver a missão cumprida. Tente sozinho antes: quase sempre há mais de uma solução certa, e o editor confere o resultado, não se o seu código é igual ao da solução.
Pratique agora com uma missão que usa o código de saída:
Missão: faça o programa terminar com o código de saída 3. Para isso, acrescente uma última linha com exit(3); e rode. Repare no [código de saída: 3] no fim do terminal e na mensagem embaixo da caixa. Depois, clique em Restaurar e em Ver solução para conhecer os dois botões.
<?php echo "Conferindo o estoque...\n"; echo "Faltam 3 produtos.\n";
<?php echo "Conferindo o estoque...\n"; echo "Faltam 3 produtos.\n"; exit(3);
O que funciona e o que não funciona
O PHP do navegador é o PHP de verdade, mas o "computador de mentirinha" onde ele roda não tem tudo o que um computador real tem.
| Funciona | Observação |
|---|---|
| Toda a linguagem PHP 8.5 | Variáveis, funções, classes, enums, o operador |>, exceções… |
| Arquivos | Criar, ler e apagar arquivos e pastas (file_put_contents, fopen…), dentro de /home/ana. Somem quando você roda de novo. |
| SQLite | Banco de dados com PDO e pdo_sqlite (em arquivo ou na memória). |
| Extensões comuns | mbstring, json, ctype, date, pcre, session, filter, dom, SimpleXML, gd, zip… |
| Modo web | $_GET, $_POST, $_FILES (envio de arquivos), cookies, sessões, header() e redirecionamentos. |
| Terminal | $argv, fgets(STDIN), exit(código). |
| Não funciona | O que acontece | Onde aprender |
|---|---|---|
| Acessar a internet | file_get_contents("https://…") e o curl falham (Failed to open stream: no suitable wrapper could be found). | Consumir APIs mostra saídas reais do laboratório. |
| MySQL e outros servidores | Não há servidor de banco de dados no navegador. | MySQL e MariaDB |
| Rodar comandos do sistema | shell_exec, exec e parecidos não executam nada (devolvem vazio ou null). | PHP na Linha de Comando |
readline() e o php -a | A função não existe; use fgets(STDIN). | PHP na Linha de Comando |
| Composer e pacotes | Não há como baixar pacotes. | Composer |
| O sistema operacional | PHP_OS_FAMILY responde Unknown, e o fuso horário é UTC. | Datas e Horas |
Quando uma aula trata de algo que não roda no navegador, ela mostra a saída real do laboratório do guia num bloco de terminal (os que começam com ana@notebook:~$), em vez de uma caixa Experimente.
O que você digita nas caixas não fica guardado: ao recarregar a página ou sair dela, tudo volta ao original. Gostou de um código? Copie para o seu editor (aula Editores e IDEs) e salve num arquivo.
Quando dá errado
O que aconteceu: o PHP ainda está sendo baixado (na primeira vez, cerca de 8 MB), ou a internet caiu no meio.
Como resolver: espere a barra chegar ao fim. Se aparecer Não consegui carregar o PHP, confira a conexão e clique em Rodar de novo. Navegadores muito antigos não executam WebAssembly; use uma versão atual do Chrome, Firefox, Edge ou Safari.
O que aconteceu: a conferência é exata. Uma letra maiúscula, um acento, um espaço ou um ponto a mais ou a menos fazem diferença. Também pode haver um aviso do PHP escondido no meio da saída.
Como resolver: leia a mensagem embaixo da caixa (ela diz se falta algo no código ou se há avisos) e compare a saída com o texto da missão, caractere por caractere.
O que aconteceu: o programa está esperando você digitar algo (procure o campo de texto dentro do terminal da caixa) ou entrou num laço sem fim.
Como resolver: digite a resposta e aperte Enter, ou clique em ■ Parar.
Como resolver: clique em Restaurar. O Ctrl+Z (desfazer) também funciona dentro do editor.
Referência
| Elemento | Para que serve |
|---|---|
| ▶ Rodar / ■ Parar | Executa o código / interrompe (código 130). |
| Ctrl+Enter | Roda pelo teclado. |
| Restaurar | Volta ao código original. |
| Ver solução | Mostra uma solução da missão (pede confirmação). |
| Argumentos | Valores para $argv. |
| Entrada | Respostas prontas para fgets(STDIN), uma por linha. |
| Abas | Arquivos da caixa; o primeiro é o que roda. |
[código de saída: N] | 0 = terminou bem; 255 = erro fatal; 130 = interrompido. |
| Resultado / Código-fonte HTML | (modo web) A página desenhada / o HTML enviado e os cabeçalhos. |
| ← · ⟳ · barra de endereço | (modo web) Voltar, recarregar, pedir outro endereço do site. |
Exercícios
1. O que o editor do guia usa para rodar o seu código?
2. Uma caixa termina com [código de saída: 255]. O que provavelmente aconteceu?
3. Qual destas coisas não funciona numa caixa Experimente?
4. Numa caixa com as abas programa.php e funcoes.php, você está na aba funcoes.php e clica em Rodar. Qual arquivo é executado?
Resumo
- As caixas Experimente rodam o PHP 8.5.10 oficial, em WebAssembly, dentro do navegador; nada mexe no seu computador.
- Na primeira vez, o PHP é baixado (cerca de 8 MB); depois, roda na hora.
- Modo terminal: saída em texto, erros em destaque,
[código de saída: N]; campos Argumentos e Entrada; ■ Parar e limite de 30 segundos. - Abas = arquivos; a primeira é a que roda.
- Modo web: a página
index.phpemlocalhost:8000, com Resultado, Código-fonte HTML e cabeçalhos; links, formulários, cookies e sessões funcionam. - Missões conferem o resultado; Restaurar volta ao original; Ver solução mostra uma resposta.
- Sem internet, MySQL, comandos do sistema,
readline()nem Composer: essas aulas usam saídas reais do laboratório. - Próximo passo: o Nível 1 começa de verdade em Olá, Mundo.