Статья
📘 Глава 12. Мини-гостевая книга с ООП
Оглавление
Настало время объединить знания из предыдущих глав: формы, файлы, ООП. Мы создадим мини-гостевую книгу, куда пользователи смогут оставить сообщения. Всё — на чистом PHP без фреймворков.
🔧 Структура проекта
гостевая/
├── index.php
├── Message.php
├── MessageStorage.php
└── messages.txt
🧱 Message.php — класс сообщения
class Message {
private $автор;
private $текст;
public function __construct($автор, $текст) {
$this->автор = $автор;
$this->текст = $текст;
}
public function формат() {
return htmlspecialchars($this->автор) . ": " . htmlspecialchars($this->текст);
}
public function сохранитьФормат() {
return $this->автор . "|" . $this->текст;
}
public static function изСтроки($строка) {
[$автор, $текст] = explode("|", trim($строка), 2);
return new self($автор, $текст);
}
}
📦 MessageStorage.php — хранилище сообщений
require_once 'Message.php';
class MessageStorage {
private $файл = "messages.txt";
public function сохранить(Message $msg) {
file_put_contents($this->файл, $msg->сохранитьФормат() . "\n", FILE_APPEND);
}
public function получитьВсе() {
if (!file_exists($this->файл)) return [];
$строки = file($this->файл);
$сообщения = [];
foreach ($строки as $строка) {
$сообщения[] = Message::изСтроки($строка);
}
return $сообщения;
}
}
📄 index.php — интерфейс
<?php
require_once 'Message.php';
require_once 'MessageStorage.php';
$хранилище = new MessageStorage();
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$автор = trim($_POST["автор"] ?? "");
$текст = trim($_POST["текст"] ?? "");
if ($автор && $текст) {
$сообщение = new Message($автор, $текст);
$хранилище->сохранить($сообщение);
header("Location: " . $_SERVER['PHP_SELF']); // защита от повторной отправки
exit;
} else {
echo "Пожалуйста, заполните оба поля.";
}
}
?>
<form method="post">
<input type="text" name="автор" placeholder="Ваше имя">
<br>
<textarea name="текст" placeholder="Сообщение"></textarea>
<br>
<button type="submit">Отправить</button>
</form>
<hr>
<?php
$сообщения = $хранилище->получитьВсе();
foreach (array_reverse($сообщения) as $сообщение) {
echo "<p>" . $сообщение->формат() . "</p>";
}
?>
✅ Что мы использовали:
-
Классы
-
Инкапсуляцию
-
Статику (метод
изСтроки
) -
Работа с файлами
-
HTML-форма
-
header("Location: ...")
для защиты от повторной отправки
В следующей главе мы начнём работу с базой данных (MySQL) — подключение, выборки, вставки.
21