📘 Глава 17. Простейший Router для MVC на чистом PHP
- 🎯 Что сделаем
- 📁 Обновим структуру проекта
- ⚙️ 1. core/Router.php
- 🧠 2. Обновим MessageController.php
- 🌐 3. public/index.php
- 📝 4. Обновим форму в messages.php
- ⚠️ 5. Apache/Nginx: настройка «чистых URL»
- ✅ Что ты получил
- 🧠 Что такое ООП
- 🔍 Почему ООП важно
- 🧱 Основные понятия ООП в PHP
- 1. Класс и объект
- 2. Свойства и методы
- 3. Конструктор (__construct)
- 4. Модификаторы доступа: public, protected, private
- 5. $this
- 🏗 Построим свой первый ООП-проект
- 🎯 Зачем использовать ООП в реальных проектах
- 🧩 Практика: создаём класс GuestbookEntry
- ✅ Что ты усвоил
- ⏭ Что дальше
Настало время заменить action=...
в URL на более элегантный способ — Router, который позволит делать красивые URL и централизованно управлять маршрутами.
🎯 Что сделаем:
-
Настроим человеко-понятные URL (
/messages
,/messages/store
) -
Напишем минимальный Router
-
Упростим
index.php
📁 Обновим структуру проекта
guestbook/
├── app/
│ ├── Controllers/
│ │ └── MessageController.php
│ ├── Models/
│ │ └── Message.php
│ └── Views/
│ ├── layout.php
│ └── messages.php
├── core/
│ ├── Database.php
│ └── Router.php ← Новый файл
├── public/
│ └── index.php
⚙️ 1. core/Router.php
<?php
class Router {
private array $routes = [];
public function add(string $path, callable $handler): void {
$this->routes[$path] = $handler;
}
public function dispatch(string $uri): void {
$path = parse_url($uri, PHP_URL_PATH);
$path = rtrim($path, '/') ?: '/';
if (array_key_exists($path, $this->routes)) {
$this->routes[$path]();
} else {
http_response_code(404);
echo "404 Not Found: $path";
}
}
}
🧠 2. Обновим MessageController.php
public function createForm() {
$this->index(); // или отдельная форма, если хочешь
}
🌐 3. public/index.php
<?php
require_once __DIR__ . '/../core/Database.php';
require_once __DIR__ . '/../core/Router.php';
require_once __DIR__ . '/../app/Models/Message.php';
require_once __DIR__ . '/../app/Controllers/MessageController.php';
$db = new Database("localhost", "guestbook", "root", "password");
$model = new Message($db);
$controller = new MessageController($model);
$router = new Router();
// Маршруты
$router->add('/', fn() => $controller->index());
$router->add('/messages', fn() => $controller->index());
$router->add('/messages/store', fn() => {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$controller->store();
} else {
echo "Method Not Allowed";
}
});
$router->dispatch($_SERVER['REQUEST_URI']);
📝 4. Обновим форму в messages.php
<form method="post" action="/messages/store">
⚠️ 5. Apache/Nginx: настройка «чистых URL»
Чтобы index.php
обрабатывал все запросы, создайте .htaccess
в папке public
:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
Если ты используешь Nginx, надо настроить try_files
в конфиге:
location / {
try_files $uri /index.php?$query_string;
}
✅ Что ты получил
-
Централизованный
Router
с понятной структурой -
Отделение маршрутов от логики
-
Основу для расширения (авторизация, REST API и т.д.)
В следующей главе начнём ввод в ООП в PHP — поговорим про классы, свойства, методы, инкапсуляцию, конструкторы.
Переходим к Главе 18: Основы ООП в PHP?
Отлично! С этого момента главы будут более подробными и развернутыми. Давай погрузимся в важнейшую тему, без которой не обходится современный PHP-разработчик — Объектно-Ориентированное Программирование (ООП).
📘 Глава 18. Основы ООП в PHP: классы, свойства, методы, конструкторы
🧠 Что такое ООП?
Объектно-ориентированное программирование (ООП) — это способ организации кода, при котором данные и действия над ними объединяются в объекты. Этот подход делает код:
-
структурированным и модульным,
-
легко читаемым и расширяемым,
-
удобным для командной разработки.
🔍 Почему ООП важно?
На начальных этапах можно обойтись простыми функциями, но по мере роста проекта появляется необходимость:
-
разделить логику на модули;
-
изолировать бизнес-логику от представления;
-
повторно использовать и расширять код;
-
тестировать и масштабировать проект.
ООП как раз решает эти задачи.
🧱 Основные понятия ООП в PHP
Давайте пошагово разберём каждую ключевую составляющую ООП на примерах.
1. Класс и объект
Класс — это «чертёж», по которому создаются объекты.
class Car {
public $brand;
public $color;
public function drive() {
echo "The $this->color $this->brand is driving.";
}
}
Создаём объект:
$myCar = new Car();
$myCar->brand = "Toyota";
$myCar->color = "red";
$myCar->drive(); // Выведет: The red Toyota is driving.
2. Свойства и методы
-
Свойства (переменные) содержат данные объекта.
-
Методы (функции) описывают поведение объекта.
class User {
public string $name;
public function sayHello() {
echo "Hello, my name is $this->name.";
}
}
3. Конструктор (__construct
)
Позволяет задать значения при создании объекта:
class Product {
public string $title;
public float $price;
public function __construct(string $title, float $price) {
$this->title = $title;
$this->price = $price;
}
public function display() {
echo "Product: $this->title, Price: $this->price";
}
}
$p = new Product("Notebook", 199.99);
$p->display(); // Product: Notebook, Price: 199.99
4. Модификаторы доступа: public
, protected
, private
Они определяют, кто может обращаться к свойствам и методам:
Модификатор | Доступизвне | Доступвнутрикласса | Доступизнаследников |
---|---|---|---|
public |
✅ | ✅ | ✅ |
protected |
❌ | ✅ | ✅ |
private |
❌ | ✅ | ❌ |
class Account {
private float $balance = 0;
public function deposit(float $amount) {
if ($amount > 0) {
$this->balance += $amount;
}
}
public function getBalance(): float {
return $this->balance;
}
}
$a = new Account();
$a->deposit(100);
// echo $a->balance; // Ошибка, private!
echo $a->getBalance(); // 100
5. $this
Ключевое слово $this
используется внутри класса для доступа к текущему объекту.
public function showInfo() {
echo $this->name;
}
🏗 Построим свой первый ООП-проект
Создадим простую систему пользователей:
class User {
private string $name;
private int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
public function introduce(): void {
echo "Hi, I'm $this->name and I'm $this->age years old.";
}
public function celebrateBirthday(): void {
$this->age++;
echo "Happy Birthday, $this->name! You are now $this->age.";
}
}
$u = new User("Alice", 25);
$u->introduce(); // Hi, I'm Alice and I'm 25 years old.
$u->celebrateBirthday(); // Happy Birthday, Alice! You are now 26.
🎯 Зачем использовать ООП в реальных проектах?
ООП позволяет:
-
Упрощать и структурировать большие проекты
-
Легко внедрять шаблоны проектирования
-
Реализовать наследование, инкапсуляцию, полиморфизм
-
Повторно использовать код: один раз написав класс, можно его использовать в разных местах
🧩 Практика: создаём класс GuestbookEntry
class GuestbookEntry {
private string $author;
private string $message;
private string $date;
public function __construct(string $author, string $message) {
$this->author = $author;
$this->message = $message;
$this->date = date('Y-m-d H:i:s');
}
public function display(): void {
echo "<p><strong>" . htmlspecialchars($this->author) . "</strong>: ";
echo htmlspecialchars($this->message) . "<br><small>$this->date</small></p>";
}
}
$entry = new GuestbookEntry("Max", "PHP is awesome!");
$entry->display();
✅ Что ты усвоил
-
Что такое класс, объект, свойства и методы
-
Как работает
__construct
-
Модификаторы доступа:
public
,private
,protected
-
Как использовать
$this
-
Зачем ООП нужен в реальных проектах
⏭ Что дальше?
В следующей главе — наследование и расширяемость классов, а также автозагрузка классов (autoloading) и PSR-4.