PHP работает на сервере: собирает страницу, отправляет готовый HTML и завершается. JavaScript работает в браузере посетителя, где реагирует на клики и меняет страницу после загрузки; с Node.js он может работать и на сервере. Так что эти языки не столько соперники, сколько партнёры: типичный сайт использует PHP (или Node.js) на сервере и JavaScript в браузере.
Этот PHP-код выполняется на сервере. Браузер получает только то, что он напечатал, а вкладка Page показывает результат:
Посмотрите на вкладку Output: PHP там не осталось, только HTML. Тот же список, собранный JavaScript в браузере, выглядит так:
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);
}
Версия на PHP отправляет полную страницу, которую поисковики и медленные телефоны читают сразу. Версия на JavaScript может обновить список позже без перезагрузки, например когда посетитель удаляет товар.
Где выполняется каждый язык
| PHP | JavaScript | |
|---|---|---|
| Где выполняется | на веб-сервере (или в терминале) | в браузере, а на сервере через Node.js, Deno или Bun |
| Что видит | файлы, базы данных, окружение, секреты | страницу (DOM), клики, хранилище браузера |
| Время жизни | один запуск на запрос | пока открыта страница (браузер) или один долгий процесс (Node.js) |
| Типичная задача | собирать страницы, обрабатывать формы, API, работать с базой | интерактивность, живые обновления, одностраничные приложения, серверы на Node.js |
| Посетитель может прочитать код | нет | да, в браузере |
Последняя строка важна для безопасности: всё, что есть в браузерном JavaScript, видно посетителю, поэтому пароли, API-ключи и проверки цен должны быть на сервере.
Синтаксис рядом
Языки похожи, потому что оба заимствуют у C: фигурные скобки, if, for, while, function, return. Различия в деталях:
| Задача | PHP | JavaScript |
|---|---|---|
| Переменная | $name = "Ada"; | let name = "Ada"; |
| Константа | const MAX = 10; | const MAX = 10; |
| Склеить строки | "Hi " . $name | "Hi " + name |
| Шаблонная строка | "Hi $name" | `Hi ${name}` |
| Список | ["a", "b"] | ["a", "b"] |
| Ключ/значение | ["id" => 1] | { id: 1 } |
| Длина | count($list), strlen($s) | list.length, s.length |
| Цикл | foreach ($list as $item) | for (const item of list) |
| Стрелочная функция | fn($x) => $x * 2 | (x) => x * 2 |
| Вывод | echo "Hi"; | console.log("Hi"); |
Вот функция с колбэком на PHP:
И на JavaScript, где map и filter это методы массива:
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(", "));
Оператор +: классическая ловушка
В JavaScript + и складывает числа, и склеивает строки, поэтому одна строка превращает сложение в конкатенацию. PHP разделяет эти действия: + всегда складывает, а . всегда склеивает.
console.log("10" + 5); // "105"
console.log("10" - 5); // 5
console.log("3" * "4"); // 12
console.log(0.1 + 0.2 === 0.3); // false
В обоих языках также есть нестрогое == и строгое ===. Совет одинаковый: используйте ===, если не собираетесь сравнивать значения разных типов.
Передача данных из PHP в JavaScript
PHP выполняется первым, поэтому может записать данные прямо в страницу, чтобы ими воспользовался JavaScript в браузере. json_encode превращает массив PHP в корректный JavaScript:
Вкладка Output показывает сгенерированный скрипт с уже подставленными данными. Флаг JSON_HEX_TAG экранирует < и >, так что значение с </script> не сможет преждевременно закрыть скрипт. Подробнее об опциях в json_encode.
В обратную сторону данные идут через HTTP: браузерный JavaScript вызывает fetch("/api/cart.php"), PHP-скрипт выполняется и отвечает 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 или Node.js на сервере
Когда JavaScript работает на сервере через Node.js, сравнение превращается в настоящий выбор.
| PHP | Node.js | |
|---|---|---|
| Модель | свежий запуск на каждый запрос, ничего общего | один долгоживущий процесс с циклом событий |
| Ожидание ввода-вывода | блокирует этот запрос (другие запросы идут в других воркерах) | неблокирующее, async/await |
| В чём хорош | сайты с серверным рендерингом, CMS, классические CRUD-приложения | приложения реального времени, веб-сокеты, много простаивающих соединений |
| Хостинг | любой виртуальный хостинг, PHP-FPM | менеджер процессов Node или платформа вроде Vercel |
| Крупные фреймворки | Laravel, Symfony, WordPress | Express, NestJS, Next.js |
| Один язык на фронте и бэке | нет | да |
Модель PHP прощает ошибки: баг или утечка памяти затрагивают только один запрос, и каждый запрос начинается с чистого листа. Модель Node позволяет держать состояние и соединения открытыми, что подходит для чатов и живых дашбордов, но сбой или блокирующий цикл затрагивает всех пользователей этого процесса.
Что учить
JavaScript понадобится для любой интерактивной веб-страницы, потому что это единственный язык, который выполняют браузеры. Вопрос в том, что будет работать на сервере:
- Учите PHP следующим, если хотите работать с WordPress, Laravel или множеством существующих PHP-сайтов, или если нужен самый простой способ разместить динамический сайт на недорогом хостинге. Начните с того, что такое PHP.
- Оставайтесь с JavaScript (Node.js), если хотите один язык на весь стек или делаете функции реального времени.
Частый путь такой: HTML и CSS, потом JavaScript в браузере, потом один серверный язык. Какой бы серверный язык вы ни выбрали, формы, сессии, базы данных и JSON API работают на одних и тех же идеях HTTP, так что знания переносятся.
Часто задаваемые вопросы
Может ли JavaScript заменить PHP?
На сервере да: Node.js (с Express, Next.js и подобными) выполняет те же задачи, что и PHP. В браузере PHP не может заменить JavaScript совсем, потому что браузеры выполняют только JavaScript. Поэтому многие сайты используют PHP или Node на сервере и JavaScript в браузере.
Как передать переменную PHP в JavaScript?
Выведите её в страницу как JSON: <script>const user = <?= json_encode($user, JSON_HEX_TAG) ?>;</script>. json_encode выдаёт корректный JavaScript для строк, чисел, массивов и объектов, а JSON_HEX_TAG не даёт </script> внутри данных закрыть тег.
Может ли JavaScript вызвать функцию PHP?
Напрямую нет, потому что PHP выполняется на сервере, а JavaScript в браузере. JavaScript отправляет HTTP-запрос через fetch('/api.php?id=3'), PHP-скрипт выполняется и печатает ответ (обычно JSON), а JavaScript его читает.
PHP быстрее Node.js?
Зависит от нагрузки. Node.js хорошо держит много одновременных медленных соединений (чаты, веб-сокеты) благодаря циклу событий. PHP 8 с OPcache быстр на обычных страницах вида запрос и ответ. Для большинства сайтов узкое место это база данных, а не язык.