Короткий ответ: меню на PHP обычно выносят в отдельный файл menu.php и подключают на страницах через require. Так вы меняете меню в одном месте, а оно обновляется на всех страницах сайта
Есть два простых подхода: хранить готовую HTML-разметку в отдельном файле или собрать меню из массива пунктов. Для учебного сайта лучше сразу освоить вариант с массивом — он гибче и понятнее
Структура проекта
site/
index.php
about.php
contacts.php
menu.php
Все страницы будут подключать один и тот же menu.php
Простое меню в отдельном файле
menu.php
<nav>
<a href="/index.php">Главная</a>
<a href="/about.php">О сайте</a>
<a href="/contacts.php">Контакты</a>
</nav>
index.php
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Главная</title>
</head>
<body>
<?php require __DIR__ . '/menu.php'; ?>
<h1>Главная страница</h1>
</body>
</html>
Так меню подключается в нужном месте страницы
Меню из массива
Более полезный вариант
<?php
$menu = [
['title' => 'Главная', 'url' => '/index.php'],
['title' => 'О сайте', 'url' => '/about.php'],
['title' => 'Контакты', 'url' => '/contacts.php'],
];
?>
<nav>
<?php foreach ($menu as $item): ?>
<a href="<?= htmlspecialchars($item['url'], ENT_QUOTES, 'UTF-8') ?>">
<?= htmlspecialchars($item['title'], ENT_QUOTES, 'UTF-8') ?>
</a>
<?php endforeach; ?>
</nav>
Теперь новые пункты добавляются в массив, а HTML строится автоматически
Активный пункт меню
Чтобы подсветить текущую страницу, можно сравнить адрес пункта с текущим файлом
<?php
$currentPath = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$menu = [
['title' => 'Главная', 'url' => '/index.php'],
['title' => 'О сайте', 'url' => '/about.php'],
['title' => 'Контакты', 'url' => '/contacts.php'],
];
?>
<nav>
<?php foreach ($menu as $item): ?>
<?php $isActive = $currentPath === $item['url']; ?>
<a
href="<?= htmlspecialchars($item['url'], ENT_QUOTES, 'UTF-8') ?>"
class="<?= $isActive ? 'active' : '' ?>"
>
<?= htmlspecialchars($item['title'], ENT_QUOTES, 'UTF-8') ?>
</a>
<?php endforeach; ?>
</nav>
CSS для активного пункта
<style>
nav a {
margin-right: 16px;
color: #1f2937;
}
nav a.active {
font-weight: 700;
color: #0f766e;
}
</style>
require или include
Для меню лучше использовать require, потому что без меню страница может выглядеть сломанной. Если файл не найден, require остановит выполнение и вы заметите проблему сразу
<?php require __DIR__ . '/menu.php'; ?>
__DIR__ помогает подключать файл относительно текущей папки, а не случайной рабочей директории сервера
Мини-практика
Создайте три страницы: index.php, about.php, contacts.php. Вынесите меню в menu.php, подключите его на каждой странице и добавьте активный класс для текущей страницы. Затем добавьте пункт Блог только в массив меню и проверьте, что он появился везде
Частые ошибки
Копируют меню в каждую страницу Так любое изменение придется повторять вручную
Подключают файл по неправильному пути Используйте __DIR__, чтобы путь был стабильнее
Не экранируют пункты меню Если пункты приходят из базы или админки, выводите их через htmlspecialchars()
Путают активный адрес из-за слеша /about.php и /about.php/ для сравнения разные строки
Что почитать дальше по PHP
Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:
- PHP с нуля: первый файл и вывод на страницу
- Как добавить PHP-скрипт в Denwer и открыть его в браузере
- Как посмотреть PHP-код сайта и почему браузер его не показывает
- Переход на другую страницу при нажатии кнопки в PHP



