PHP se ejecuta en el servidor: genera la página, envía el HTML terminado y se detiene. JavaScript se ejecuta en el navegador del visitante, donde reacciona a los clics y cambia la página después de cargarla; con Node.js también puede ejecutarse en el servidor. Así que los dos son menos rivales que compañeros: un sitio típico usa PHP (o Node.js) en el servidor y JavaScript en el navegador.
Este código PHP se ejecuta en el servidor. El navegador solo recibe lo que imprime, y la pestaña Página muestra ese resultado:
Mira la pestaña Salida: ya no queda nada de PHP, solo HTML. La misma lista construida por JavaScript en el navegador tiene este aspecto:
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 versión en PHP envía una página completa, que los buscadores y los móviles lentos leen de inmediato. La versión en JavaScript puede actualizar la lista más tarde sin recargar, por ejemplo cuando el visitante quita un producto.
Dónde se ejecuta cada lenguaje
| PHP | JavaScript | |
|---|---|---|
| Se ejecuta en | el servidor web (o una terminal) | el navegador, y el servidor con Node.js, Deno o Bun |
| Tiene acceso a | archivos, bases de datos, entorno, secretos | la página (DOM), los clics, el almacenamiento del navegador |
| Duración | una ejecución por petición | mientras la página esté abierta (navegador), o un proceso largo (Node.js) |
| Trabajo típico | generar páginas, procesar formularios, APIs, hablar con la base de datos | interactividad, actualizaciones en vivo, aplicaciones de una sola página, servidores Node.js |
| El visitante puede leer el código | no | sí, en el navegador |
La última fila importa para la seguridad: todo lo que hay en el JavaScript del navegador es visible para el visitante, así que las contraseñas, las claves de API y las comprobaciones de precios van en el servidor.
Sintaxis lado a lado
Los dos lenguajes se parecen porque ambos toman prestado de C: llaves, if, for, while, function, return. Las diferencias están en los detalles:
| Tarea | PHP | JavaScript |
|---|---|---|
| Variable | $name = "Ada"; | let name = "Ada"; |
| Constante | const MAX = 10; | const MAX = 10; |
| Unir cadenas | "Hi " . $name | "Hi " + name |
| Plantilla de cadena | "Hi $name" | `Hi ${name}` |
| Lista | ["a", "b"] | ["a", "b"] |
| Clave/valor | ["id" => 1] | { id: 1 } |
| Longitud | count($list), strlen($s) | list.length, s.length |
| Bucle | foreach ($list as $item) | for (const item of list) |
| Función flecha | fn($x) => $x * 2 | (x) => x * 2 |
| Imprimir | echo "Hi"; | console.log("Hi"); |
Esta es una función con un callback en PHP:
Y en JavaScript, donde map y filter son métodos del 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(", "));
El operador +: la trampa clásica
En JavaScript, + suma números y también une cadenas, así que una cadena en cualquier lugar convierte la suma en concatenación. PHP separa las dos cosas: + siempre suma y . siempre une.
console.log("10" + 5); // "105"
console.log("10" - 5); // 5
console.log("3" * "4"); // 12
console.log(0.1 + 0.2 === 0.3); // false
Los dos lenguajes tienen también el == flexible y el === estricto. El consejo es el mismo en ambos: usa === salvo que quieras comparar entre tipos distintos.
Pasar datos de PHP a JavaScript
PHP se ejecuta primero, así que puede escribir datos directamente en la página para que los use el JavaScript del navegador. json_encode convierte un array de PHP en JavaScript válido:
La pestaña Salida muestra el script generado con los datos ya rellenados. La opción JSON_HEX_TAG escapa < y >, de modo que un valor que contenga </script> no puede terminar el script antes de tiempo. Hay más sobre las opciones en json_encode.
La otra dirección funciona mediante HTTP: el JavaScript del navegador llama a fetch("/api/cart.php"), el script PHP se ejecuta y responde 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 en el servidor
Cuando JavaScript se ejecuta en el servidor mediante Node.js, la comparación se convierte en una elección real.
| PHP | Node.js | |
|---|---|---|
| Modelo | una ejecución nueva por petición, sin nada compartido | un proceso de larga duración con un event loop |
| Espera de E/S | bloquea esa petición (las demás se ejecutan en otros workers) | no bloqueante, async/await |
| Bueno para | sitios renderizados en el servidor, CMS, apps CRUD clásicas | apps en tiempo real, websockets, muchas conexiones inactivas |
| Hosting | cualquier hosting compartido, PHP-FPM | un gestor de procesos de Node o una plataforma como Vercel |
| Grandes frameworks | Laravel, Symfony, WordPress | Express, NestJS, Next.js |
| Un solo lenguaje en front y back | no | sí |
El modelo de PHP es indulgente: un bug o una fuga de memoria solo afecta a una petición, y cada petición empieza limpia. El modelo de Node puede mantener estado y conexiones abiertas, lo que encaja con chats y paneles en vivo, pero un fallo o un bucle bloqueante afecta a todos los usuarios de ese proceso.
Cuál aprender
Necesitarás JavaScript para cualquier página web interactiva, porque es el único lenguaje que ejecutan los navegadores. La cuestión es qué se ejecuta en el servidor:
- Aprende PHP a continuación si quieres trabajar con WordPress, Laravel o los muchos sitios PHP que ya existen, o si buscas la forma más sencilla de poner un sitio dinámico en un hosting barato. Empieza por qué es PHP.
- Quédate con JavaScript (Node.js) si quieres un solo lenguaje para todo el stack o estás construyendo funciones en tiempo real.
Un camino habitual es HTML y CSS, luego JavaScript en el navegador y después un lenguaje de servidor. Elijas el que elijas, los formularios, las sesiones, las bases de datos y las APIs JSON funcionan con las mismas ideas de HTTP, así que el conocimiento se traslada.
Preguntas frecuentes
¿Puede JavaScript sustituir a PHP?
En el servidor, sí: Node.js (con Express, Next.js o similares) hace los mismos trabajos que PHP. En el navegador, PHP no puede sustituir a JavaScript en absoluto, porque los navegadores solo ejecutan JavaScript. Por eso muchos sitios usan PHP o Node en el servidor y JavaScript en el navegador.
¿Cómo paso una variable de PHP a JavaScript?
Imprímela en la página como JSON: <script>const user = <?= json_encode($user, JSON_HEX_TAG) ?>;</script>. json_encode produce JavaScript válido para cadenas, números, arrays y objetos, y JSON_HEX_TAG impide que un </script> dentro de los datos cierre la etiqueta.
¿Puede JavaScript llamar a una función de PHP?
No directamente, porque PHP se ejecuta en el servidor y JavaScript en el navegador. JavaScript envía una petición HTTP con fetch('/api.php?id=3'), el script PHP se ejecuta e imprime una respuesta (normalmente JSON) y JavaScript la lee.
¿PHP es más rápido que Node.js?
Depende de la carga de trabajo. Node.js maneja bien muchas conexiones lentas simultáneas (chat, websockets) gracias a su event loop. PHP 8 con OPcache es rápido para páginas normales de petición y respuesta. En la mayoría de los sitios el cuello de botella es la base de datos, no el lenguaje.