Статья

📘 Глава 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) — подключение, выборки, вставки.

PHP
Для ответа вы можете авторизоваться