Перейти к основному содержимому

index.php и require — точка входа и подключение

Разработчику

PHP-файл выполняется сверху вниз при каждом HTTP-запросе или запуске php script.php. Аналог Python if __name__ == "__main__":разделение ролей: один entrypoint (public/index.php, artisan, CLI-скрипт) и подключаемые файлы только с функциями и классами.

См. также: Первая программа · Composer и автозагрузка · Python — __name__.


Проблема «всё в одном файле»

<?php
function add(int $a, int $b): int {
return $a + $b;
}

echo add(5, 3); // выполнится при каждом require!

Файл require 'calculator.php' из другого скрипта тоже выведет 8.


Подключаемый файл без побочных эффектов

<?php
// src/Calculator.php — только определения
function calculator_add(int $a, int $b): int {
return $a + $b;
}
<?php
// bin/demo.php — точка входа CLI
require __DIR__ . '/../src/Calculator.php';

echo calculator_add(5, 3);

Запуск: php bin/demo.php. Подключение Calculator.php из веб-приложения не печатает демо.


Веб — public/index.php

Современные проекты (Laravel, Symfony) направляют все запросы в один front controller:

public/
index.php ← единственная точка входа HTTP
src/
… ← классы, подключаются автозагрузчиком

Nginx/Apache отдаёт только public/. Остальные .php не должны быть доступны по URL — иначе их можно вызвать напрямую с побочным кодом. Пример конфига nginx + PHP-FPM — Nginx — конфиги под задачу.


CLI и проверка SAPI

Для скрипта, который иногда подключают, иногда запускают:

<?php
function add(int $a, int $b): int {
return $a + $b;
}

if (php_sapi_name() === 'cli' && basename(__FILE__) === basename($_SERVER['argv'][0] ?? '')) {
echo add(5, 3);
}

На практике проще два файла: библиотека + bin/ скрипт — как в Python с отдельным main.py.


require_once и автозагрузка

МеханизмНазначение
require / includeПодключить файл (ошибка, если нет)
require_onceПодключить один раз
Composer PSR-4Классы без ручного require

Файлы с классами не должны выводить HTML или запускать БД при загрузке — только объявления.


Сравнение с Python

PythonPHP
if __name__ == "__main__":Отдельный index.php / bin/ + «чистые» include
import modulerequire / autoload class
Код верхнего уровня при importВыполняется при каждом include

Дальше по разделу

ТемаСтатья
Первая программа13 — Первая программа
Composer111 — Composer
Laravel entry1431 — Laravel

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").