PHP gira sul server: costruisce la pagina, invia l'HTML finito e si ferma. JavaScript gira nel browser del visitatore, dove reagisce ai clic e modifica la pagina dopo il caricamento; con Node.js può girare anche sul server. Quindi i due sono più partner che rivali: un sito tipico usa PHP (o Node.js) sul server e JavaScript nel browser.
Questo codice PHP gira sul server. Il browser riceve solo ciò che stampa, e la scheda Page mostra quel risultato:
Guarda la scheda Output: non c'è più traccia di PHP, solo HTML. La stessa lista costruita da JavaScript nel browser ha questo aspetto:
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);
}
La versione PHP invia una pagina completa, che i motori di ricerca e i telefoni lenti leggono subito. La versione JavaScript può aggiornare la lista più tardi senza ricaricare, per esempio quando il visitatore rimuove un elemento.
Dove gira ciascun linguaggio
| PHP | JavaScript | |
|---|---|---|
| Gira in | il web server (o un terminale) | il browser, e il server con Node.js, Deno o Bun |
| Vede | file, database, ambiente, segreti | la pagina (DOM), i clic, lo storage del browser |
| Durata | un'esecuzione per richiesta | finché la pagina è aperta (browser), oppure un unico processo lungo (Node.js) |
| Lavoro tipico | costruire pagine, gestire form, API, parlare con il database | interattività, aggiornamenti live, single-page app, server Node.js |
| Il visitatore può leggere il codice | no | sì, nel browser |
L'ultima riga conta per la sicurezza: tutto ciò che sta nel JavaScript del browser è visibile al visitatore, quindi password, chiavi API e controlli sui prezzi vanno sul server.
Sintassi a confronto
I due linguaggi si somigliano perché entrambi prendono da C: graffe, if, for, while, function, return. Le differenze stanno nei dettagli:
| Operazione | PHP | JavaScript |
|---|---|---|
| Variabile | $name = "Ada"; | let name = "Ada"; |
| Costante | const MAX = 10; | const MAX = 10; |
| Unire stringhe | "Hi " . $name | "Hi " + name |
| Stringa con variabili | "Hi $name" | `Hi ${name}` |
| Lista | ["a", "b"] | ["a", "b"] |
| Chiave/valore | ["id" => 1] | { id: 1 } |
| Lunghezza | count($list), strlen($s) | list.length, s.length |
| Ciclo | foreach ($list as $item) | for (const item of list) |
| Arrow function | fn($x) => $x * 2 | (x) => x * 2 |
| Stampa | echo "Hi"; | console.log("Hi"); |
Ecco una funzione con una callback in PHP:
E in JavaScript, dove map e filter sono metodi dell'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(", "));
L'operatore +: la trappola classica
In JavaScript + somma i numeri e unisce le stringhe, quindi una stringa da qualche parte trasforma la somma in concatenazione. PHP tiene separate le due cose: + somma sempre e . unisce sempre.
console.log("10" + 5); // "105"
console.log("10" - 5); // 5
console.log("3" * "4"); // 12
console.log(0.1 + 0.2 === 0.3); // false
Entrambi i linguaggi hanno anche == non stretto e === stretto. Il consiglio è lo stesso in entrambi: usa === a meno che tu non voglia confrontare tipi diversi.
Passare dati da PHP a JavaScript
PHP gira per primo, quindi può scrivere i dati direttamente nella pagina perché il JavaScript del browser li usi. json_encode trasforma un array PHP in JavaScript valido:
La scheda Output mostra lo script generato con i dati già inseriti. Il flag JSON_HEX_TAG fa l'escape di < e >, così un valore che contiene </script> non può chiudere lo script prima del tempo. Altre opzioni in json_encode.
La direzione opposta passa da HTTP: il JavaScript del browser chiama fetch("/api/cart.php"), lo script PHP gira e risponde con 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 vs Node.js sul server
Quando JavaScript gira sul server tramite Node.js, il confronto diventa una vera scelta.
| PHP | Node.js | |
|---|---|---|
| Modello | un'esecuzione nuova per richiesta, niente di condiviso | un unico processo sempre attivo con un event loop |
| Attesa dell'I/O | blocca quella richiesta (le altre girano in altri worker) | non bloccante, async/await |
| Bravo in | siti renderizzati sul server, CMS, classiche app CRUD | app in tempo reale, websocket, molte connessioni inattive |
| Hosting | qualsiasi hosting condiviso, PHP-FPM | un process manager per Node o una piattaforma come Vercel |
| Framework principali | Laravel, Symfony, WordPress | Express, NestJS, Next.js |
| Un solo linguaggio per front e back | no | sì |
Il modello di PHP perdona: un bug o una perdita di memoria colpisce solo una richiesta, e ogni richiesta parte pulita. Il modello di Node può tenere aperti stato e connessioni, il che si adatta a chat e dashboard live, ma un crash o un ciclo bloccante colpisce tutti gli utenti di quel processo.
Quale imparare
JavaScript ti servirà per qualsiasi pagina web interattiva, perché è l'unico linguaggio che i browser eseguono. La domanda è cosa gira sul server:
- Impara PHP come passo successivo se vuoi lavorare con WordPress, Laravel o i tanti siti PHP esistenti, oppure se vuoi il modo più semplice per mettere un sito dinamico su un hosting economico. Inizia da cos'è PHP.
- Resta su JavaScript (Node.js) se vuoi un solo linguaggio per tutto lo stack o stai costruendo funzionalità in tempo reale.
Un percorso comune è HTML e CSS, poi JavaScript nel browser, poi un linguaggio lato server. Qualunque linguaggio lato server tu scelga, form, sessioni, database e API JSON si basano sulle stesse idee di HTTP, quindi le conoscenze si trasferiscono.
Domande frequenti
JavaScript può sostituire PHP?
Sul server sì: Node.js (con Express, Next.js o simili) fa gli stessi lavori di PHP. Nel browser PHP non può sostituire JavaScript in alcun modo, perché i browser eseguono solo JavaScript. Per questo molti siti usano PHP o Node sul server e JavaScript nel browser.
Come passo una variabile PHP a JavaScript?
Stampala nella pagina come JSON: <script>const user = <?= json_encode($user, JSON_HEX_TAG) ?>;</script>. json_encode produce JavaScript valido per stringhe, numeri, array e oggetti, e JSON_HEX_TAG impedisce a un </script> dentro i dati di chiudere il tag.
JavaScript può chiamare una funzione PHP?
Non direttamente, perché PHP gira sul server e JavaScript nel browser. JavaScript invia una richiesta HTTP con fetch('/api.php?id=3'), lo script PHP gira e stampa una risposta (di solito JSON), e JavaScript la legge.
PHP è più veloce di Node.js?
Dipende dal carico. Node.js gestisce bene molte connessioni lente simultanee (chat, websocket) grazie al suo event loop. PHP 8 con OPcache è veloce per le normali pagine a richiesta e risposta. Per la maggior parte dei siti il collo di bottiglia è il database, non il linguaggio.