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.

Você vai aprender
  • 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

TeclaO que faz
Ctrl+Enter (Mac: Cmd+Enter)Roda o código, sem tirar a mão do teclado.
TabInsere 4 espaços (o recuo padrão do PHP). Com várias linhas selecionadas, recua todas.
Shift+TabTira um nível de recuo.
EnterPula a linha mantendo o recuo; depois de {, ( ou [, recua mais um nível.
EscSai 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 (como 404) 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 no curl -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.

Endereços que não existem caem no 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:

MensagemQuer 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.

FuncionaObservação
Toda a linguagem PHP 8.5Variáveis, funções, classes, enums, o operador |>, exceções…
ArquivosCriar, ler e apagar arquivos e pastas (file_put_contents, fopen…), dentro de /home/ana. Somem quando você roda de novo.
SQLiteBanco de dados com PDO e pdo_sqlite (em arquivo ou na memória).
Extensões comunsmbstring, 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 funcionaO que aconteceOnde aprender
Acessar a internetfile_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 servidoresNão há servidor de banco de dados no navegador.MySQL e MariaDB
Rodar comandos do sistemashell_exec, exec e parecidos não executam nada (devolvem vazio ou null).PHP na Linha de Comando
readline() e o php -aA função não existe; use fgets(STDIN).PHP na Linha de Comando
Composer e pacotesNão há como baixar pacotes.Composer
O sistema operacionalPHP_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.

Nada é salvo

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

Cliquei em Rodar e nada aconteceu (ou ficou "Carregando…")

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.

A missão não fica "cumprida", mas a saída parece certa

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 programa ficou rodando e o botão diz "■ Parar"

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.

Apaguei tudo sem querer

Como resolver: clique em Restaurar. O Ctrl+Z (desfazer) também funciona dentro do editor.


Referência

ElementoPara que serve
▶ Rodar / ■ PararExecuta o código / interrompe (código 130).
Ctrl+EnterRoda pelo teclado.
RestaurarVolta ao código original.
Ver soluçãoMostra uma solução da missão (pede confirmação).
ArgumentosValores para $argv.
EntradaRespostas prontas para fgets(STDIN), uma por linha.
AbasArquivos 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.php em localhost: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.