O PHP roda no servidor: monta a página, envia o HTML pronto e para. O JavaScript roda no navegador do visitante, onde reage a cliques e altera a página depois que ela carregou; com Node.js ele também pode rodar no servidor. Então os dois são menos rivais do que parceiros: um site típico usa PHP (ou Node.js) no servidor e JavaScript no navegador.
Este código PHP roda no servidor. O navegador recebe só o que ele imprime, e a aba Page mostra esse resultado:
Olhe a aba Output: não sobrou nada de PHP, só HTML. A mesma lista montada por JavaScript no navegador fica assim:
const products = [
{ name: "Keyboard", price: 49 },
{ name: "Mouse", price: 19 },
{ name: "Monitor", price: 189 },
];
const ul = document.querySelector("#cart"); // an empty <ul id="cart"> in the HTML
for (const p of products) {
const li = document.createElement("li");
li.textContent = `${p.name}: $${p.price}`;
ul.append(li);
}
A versão em PHP envia uma página completa, que mecanismos de busca e celulares lentos leem na hora. A versão em JavaScript pode atualizar a lista depois sem recarregar, por exemplo quando o visitante remove um item.
Onde cada linguagem roda
| PHP | JavaScript | |
|---|---|---|
| Roda em | no servidor web (ou num terminal) | no navegador, e no servidor com Node.js, Deno ou Bun |
| Enxerga | arquivos, bancos de dados, ambiente, segredos | a página (DOM), cliques, o armazenamento do navegador |
| Tempo de vida | uma execução por requisição | enquanto a página estiver aberta (navegador), ou um processo longo (Node.js) |
| Trabalho típico | montar páginas, tratar formulários, APIs, falar com o banco | interatividade, atualizações ao vivo, single-page apps, servidores Node.js |
| O visitante pode ler o código | não | sim, no navegador |
A última linha importa para a segurança: tudo o que está no JavaScript do navegador fica visível ao visitante, então senhas, chaves de API e verificações de preço ficam no servidor.
Sintaxe lado a lado
As duas linguagens se parecem porque ambas herdam do C: chaves, if, for, while, function, return. As diferenças estão nos detalhes:
| Tarefa | PHP | JavaScript |
|---|---|---|
| Variável | $name = "Ada"; | let name = "Ada"; |
| Constante | const MAX = 10; | const MAX = 10; |
| Juntar strings | "Hi " . $name | "Hi " + name |
| Template string | "Hi $name" | `Hi ${name}` |
| Lista | ["a", "b"] | ["a", "b"] |
| Chave/valor | ["id" => 1] | { id: 1 } |
| Tamanho | count($list), strlen($s) | list.length, s.length |
| Loop | foreach ($list as $item) | for (const item of list) |
| Arrow function | fn($x) => $x * 2 | (x) => x * 2 |
| Imprimir | echo "Hi"; | console.log("Hi"); |
Aqui está uma função com callback em PHP:
E em JavaScript, onde map e filter são métodos do array:
const prices = [12.5, 8, 30, 4.25];
const withTax = prices.map((p) => Math.round(p * 1.2 * 100) / 100);
const cheap = withTax.filter((p) => p < 15);
console.log(withTax.join(", "));
console.log("Under 15: " + cheap.join(", "));
O operador +: a armadilha clássica
No JavaScript, + tanto soma números quanto junta strings, então uma string em qualquer lugar transforma a soma em concatenação. O PHP separa as duas coisas: + sempre soma e . sempre junta.
console.log("10" + 5); // "105"
console.log("10" - 5); // 5
console.log("3" * "4"); // 12
console.log(0.1 + 0.2 === 0.3); // false
As duas linguagens também têm o == frouxo e o === estrito. O conselho é o mesmo nas duas: use ===, a menos que você queira comparar tipos diferentes.
Passar dados do PHP para o JavaScript
O PHP roda primeiro, então pode escrever dados direto na página para o JavaScript do navegador usar. json_encode transforma um array PHP em JavaScript válido:
A aba Output mostra o script gerado com os dados já preenchidos. A flag JSON_HEX_TAG escapa < e >, então um valor contendo </script> não consegue encerrar o script antes da hora. Mais sobre as opções em json_encode.
O caminho inverso passa por HTTP: o JavaScript do navegador chama fetch("/api/cart.php"), o script PHP roda e responde com JSON:
<?php
// api/cart.php
header('Content-Type: application/json');
echo json_encode(['items' => 3, 'total' => 257]);
const res = await fetch("/api/cart.php");
const cart = await res.json();
console.log(cart.total); // 257
PHP ou Node.js no servidor
Quando o JavaScript roda no servidor com Node.js, a comparação vira uma escolha de verdade.
| PHP | Node.js | |
|---|---|---|
| Modelo | uma execução nova por requisição, nada compartilhado | um processo de longa duração com event loop |
| Espera por I/O | bloqueia aquela requisição (as outras rodam em outros workers) | não bloqueante, async/await |
| Bom para | sites renderizados no servidor, CMSs, apps CRUD clássicos | apps em tempo real, websockets, muitas conexões ociosas |
| Hospedagem | qualquer hospedagem compartilhada, PHP-FPM | um gerenciador de processos Node ou uma plataforma como a Vercel |
| Grandes frameworks | Laravel, Symfony, WordPress | Express, NestJS, Next.js |
| Uma linguagem no front e no back | não | sim |
O modelo do PHP perdoa bastante: um bug ou vazamento de memória afeta só uma requisição, e cada requisição começa limpa. O modelo do Node pode manter estado e conexões abertas, o que combina com chat e dashboards ao vivo, mas uma falha ou um loop bloqueante afeta todos os usuários daquele processo.
Qual aprender
Você vai precisar de JavaScript em qualquer página web interativa, porque é a única linguagem que os navegadores executam. A questão é o que roda no servidor:
- Aprenda PHP em seguida se você quer trabalhar com WordPress, Laravel ou os muitos sites PHP que já existem, ou se quer o jeito mais simples de colocar um site dinâmico numa hospedagem barata. Comece por o que é PHP.
- Fique no JavaScript (Node.js) se você quer uma linguagem para a stack inteira ou está criando recursos em tempo real.
Um caminho comum é HTML e CSS, depois JavaScript no navegador, depois uma linguagem de servidor. Qualquer que seja a linguagem de servidor escolhida, formulários, sessões, bancos de dados e APIs JSON funcionam com as mesmas ideias de HTTP, então o conhecimento se transfere.
Perguntas frequentes
JavaScript pode substituir o PHP?
No servidor, sim: o Node.js (com Express, Next.js ou parecidos) faz os mesmos trabalhos que o PHP. No navegador, o PHP não substitui o JavaScript de jeito nenhum, porque os navegadores só executam JavaScript. Por isso muitos sites usam PHP ou Node no servidor e JavaScript no navegador.
Como passo uma variável PHP para o JavaScript?
Imprima-a na página como JSON: <script>const user = <?= json_encode($user, JSON_HEX_TAG) ?>;</script>. json_encode gera JavaScript válido para strings, números, arrays e objetos, e JSON_HEX_TAG impede que um </script> dentro dos dados feche a tag.
O JavaScript pode chamar uma função PHP?
Não diretamente, porque o PHP roda no servidor e o JavaScript no navegador. O JavaScript envia uma requisição HTTP com fetch('/api.php?id=3'), o script PHP roda e imprime uma resposta (normalmente JSON), e o JavaScript a lê.
PHP é mais rápido que Node.js?
Depende da carga de trabalho. O Node.js lida bem com muitas conexões lentas simultâneas (chat, websockets) graças ao event loop. O PHP 8 com OPcache é rápido para páginas comuns de requisição e resposta. Na maioria dos sites o gargalo é o banco de dados, não a linguagem.