Большая часть веба построена по так называемой клиент-серверной модели. Клиент (например, браузер) делает запрос на сервер, сервер готовит ответ и отправляет его обратно. Причем сама обработка зависит, как правило, от того, какой был запрошен адрес и с каким методом http. Чаще всего используются post и get запросы. Ничего страшного, если сейчас вы не до конца понимаете, что значит «метод http». В соответствующем курсе они рассматриваются достаточно подробно.
Грубо говоря, каждому url соответствует определенная функция-обработчик. Типичное веб-приложение можно представить как набор обработчиков, связанных с определенными урлами:
<?php
$handlers = [
'/' => 'index',
'/about' => 'about',
'/users' => 'users'
];
// Где-то здесь проверка входящего урла и вызов обработчика, соответствующего имени в массиве $handlers
Если начать реализовывать эту идею на практике, то окажется что любой веб-сайт содержит в себе много общей логики, которая структурирует приложение:
- Принять запрос.
- Определить, какой обработчик должен выполниться.
- Выполнить обработчик и подготовить ответ.
- Вернуть ответ клиенту.
Такую логику действительно выделяют и обзывают каркасом или, по-умному, фреймворком.
Фреймворки — центральная тема профессионального веба. Вот как выглядит код с использованием фреймворка:
<?php
// public/index.php
require_once __DIR__ . '/../vendor/autoload.php';
use Slim\Factory\AppFactory;
$app = AppFactory::create();
$app->addErrorMiddleware(true, true, true);
$app->get('/', function () {
return 'Main Page';
});
$app->get('/about', function () {
return 'About Page';
});
$app->run();
Если не обращать особое внимание на кучу незнакомого синтаксиса, можно увидеть общую структуру. Описываются обработчики для метода GET (часть $app->get
) с адресами /
и /about
. На каждый адрес определяется функция-обработчик, которая возвращает строку.
Пример выше сделан с использованием микрофреймворка Slim. Отличие микрофреймворков от фреймворков в том, что все они (на всех языках) устроены подобным образом. Сам код на них простой и требует создания буквально одного файла. Микрофреймворки практически ничего не могут самостоятельно. Любая новая функциональность достигается сторонними библиотеками.
С фреймворками ситуация другая. Как правило, они содержат внутри себя большое количество возможностей, необходимых в повседневной разработке. С ними сложнее стартануть, и базовая установка может содержать десятки файлов. Проще всего начать изучение с микрофреймворков и постепенно двигаться к полнофункциональным фреймворкам.
Пример, который мы видим, представляет собой полноценный веб-сайт. Да, он примитивный, но все же полноценный. И несмотря на небольшое количество кода и отсутствие какой-либо логики, в ход идут возможности PHP, которые ранее не изучались. К ним относятся аспекты как объектно-ориентированного кода, так и функционального. Причем, что первое, что второе — не просто новый синтаксис, а подходы, существенно влияющие на способ мышления и разработки.
Именно по этой причине обучение фреймворку на первых порах создает больше проблем, чем приносит пользы. Подробно ни одна тема не раскроется и не будет отработана, все действия превратятся в повторение за учителем без особого понимания. Шаг влево или вправо от заученных конструкций приведет к полному ступору.
Вот лишь некоторые из понятий, которые присутствуют в данном коде:
- Класс
- Объект
- Метод
- Функции как объекты первого рода
- Функции высшего порядка
Возможно, чисто синтаксически это не очевидно, но в примере функции-обработчики не просто создаются, но и передаются в другие функции (конкретно в вызов get
). Другими словами, определение функции выступает как выражение, а сами функции — данные, точно такие же, как и числа или строки. Именно с этой темы мы начнем наше погружение в язык в следующем курсе.
Самостоятельная работа
Создайте php-проект (используя Composer) с кодом из описания фреймворка https://github.com/slimphp/Slim
- Выполните инициализацию проекта.
- Установите фреймворк как зависимость.
- Создайте файл
public/index.php
, куда добавьте пример из README (абзац — "Hello World using AppFactory with PSR-7 auto-detection"). - Установите пакеты (зависимости) по инструкции из README.
- Запустите проект, выполнив команду
php -S localhost:5555 -t public
в корне проекта. - Откройте страницу http://localhost:5555/hello/mike, а затем http://localhost:5555/hello/john.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты